Flutter 에서 Http protocol을 위해 Retrofit을 자주 쓴고
또한 많은 REST Api들이 Json 형태로 Response를 던져 준다.
하여 일반적으로
Client - Retrofit
Model - Json Serializable
Builder - Retrofit Generator
로 많이들 사용한다. 다만 아쉽게도 위 과정을 통해 나온 Model은
properties
method for json
은 생성 자동 생성 해주지만
toString
operator ==
hashCode
copyWith
는 자동 생성 해주지 않는다.
flutter pub add freezed_annotation
flutter pub add --dev build_runner
flutter pub add --dev freezed
위 세개만 추가하면 된다
우선 @freezed 와 @unfreezed를 살펴봐야 한다
@freezed
말그대로 모든 property가 immutable한 모델을 생성하겠다는것이고
immutable한 property들은 final 로 declare 된다.
@unfreezed
모든 properties가 mutable한 모델을 생성하겠다는것이다.
물론 나머지는 mutable 하게, 특정 property들만 immutable하게 하는것도 가능
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:flutter/foundation.dart';
// 얘는 필수다.
// freezed builder가 현재 파일을 빌드하고
// person.freezed.dart에 기록 한다
part 'person.freezed.dart';
@freezed
class Person with _$Person {
const factory Person({
required String firstName,
required String lastName,
required int age,
}) = _Person;
}
를 flutter pub run build_runner build 하면
person.freezed.dart 에
immutable한
final String get firstName;
final String get lastName;
final int get age;
property들과
toString, operator ==, hashCode, copyWith 를
자동 생성 해준다
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:flutter/foundation.dart';
part 'person.freezed.dart';
@unfreezed
class Person with _$Person {
factory Person({
required String firstName,
required String lastName,
required int age,
}) = _Person;
}
(@freezed -> @unfreezed로 바꿈)
(factory 앞에 const는 mutable property가 생기기 때문에 빠짐)
를 flutter pub run build_runner build 하면
person.freezed.dart 에
mutable한
String get firstName;
String get lastName;
int get age;
property들과
toString, operator ==, hashCode, copyWith 를
자동 생성 해준다.
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:flutter/foundation.dart';
part 'person.freezed.dart';
@unfreezed
class Person with _$Person {
factory Person({
required String firstName,
required String lastName,
required final int age,
}) = _Person;
}
@unfreezed시 전부 mutable한 property가 생성 되는데
특정 property(여기서는 age)만 immutable하게 만들고 싶다면
required int age -> required final int age
를 flutter pub run build_runner build 하면
person.freezed.dart 에
mutable한
String get firstName;
String get lastName;
immutable 한
final int get age;
property들과
toString, operator ==, hashCode, copyWith 를
자동 생성 해준다.
freezed로 자동 생성한 model에 toJson / fromJson도 자동으로 생성되게 하려면
flutter pub add json_annotation
flutter pub add --dev json_serializable
우리의 경우엔 person.g.dart 추가
만 해주면 자동 생성 된다. 예를들면 아래와 같다
import 'package:freezed_annotation/freezed_annotation.dart';
part 'person.freezed.dart';
part 'person.g.dart';
@freezed
class Person with _$Person {
factory Person({
required String firstName,
required String lastName,
required int age,
}) = _Person;
factory Person.fromJson(Map<String, Object?> json)
=> _$PersonFromJson(json);
}