Freezed 패키지 링크 : https://pub.dev/packages/freezed
freezed는 불변성을 지닌 객체를 생성할 수 있도록 도움을 주는 코드 생성 패키지인데, freezed_annotation, json_serializable, json_annotation, build_runner와 세트로 사용된다.
provider와 river_pod의 개발자인 Remi Rousselect가 만들었으며, 나는 주로 데이터 모델을 만들 때 사용한다.
freezed를 사용하는 방법은 아래와 같다.
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:flutter/foundation.dart';
part 'your_model_name.freezed.dart';
part 'your_model_name.g.dart'; //json 직렬화를 사용하려면 추가
class MyModel with _$MyModel {
const factory MyModel({
required String firstName, // 모델 생성 시 필수로 입력해야하는 값
("") String lastName, // 모델 생성 시 입력되는 값이 없으면 기본 값으로 "" 입력
int? age, // 모델 생성 시 입력되지 않을 수 있음(입력 안되면 null)
}) = _MyModel;
factory MyModel.fromJson(Map<String, Object?> json)
=> _$MyModelFromJson(json);
}
작성된 코드는 아래의 명령어를 터미널에 입력해 freezed가 자동으로 코드를 작성할 수 있도록 한다.
$ flutter pub run build_runner build --delete-conflicting-outputs
위의 예시와 같이 코드를 작성해둔 상태라면 총 2개의 파일이 생성되는데, 각각 .freezed.dart
와 .g.dart
로 끝나는 파일이다.
이렇게 작성된 freezed모델은 기본적으로 immutable이기 때문에 수정이 불가능하다.
그렇기 때문에, freezed를 통해 작성된 객체는 내부에 copyWith
내장하고 있어 객체 내 변수의 값이 변동되었을 때 이를 반영할 수 있도록 한다.
사용 예시는 다음과 같다.
MyModel model = MyModel(firstName: "Raon", lastName: "Hong");
model = model.copyWith(age: 30);
freezed는 데이터 모델을 작성할 때 많이 쓰이지만 bloc이나 riverpod과 같은 상태관리 패키지의 상태를 관리하기 위해 작성되는 State객체를 생성할 때도 사용할 수 있다.