개발/Flutter

[Flutter] freezed 사용하기 ! (Code Generator)

라보떼 2023. 1. 10. 12:16


freezed 란?

간략히 말하면 data-classes / unions / pattern-matching / cloning을 위한 Code Generator
데이터 클래스에서 필요로 하는 기능들의 생성을 제공해주는 라이브러리 입니다.
Dart에는 union types 및 pattern-matching와 같은 기능이 없습니다.
이것을 직접 구현하려면 리소스가 소비되며 가독성도 떨어질수있어
이러한 문제의 해결에 탁월한 기능을 제공합니다.
  • 생성자 + 속성 정의하기
  • toString, operator ==, hashCode 오버라이드
  • 객체를 복제하기 위한 copyWith 메서드 구현
  • 역/직열화 처리

 

https://pub.dev/packages/freezed  -  SampleCode

 

 

사용법

 

freezed 사용을 위해선 build_runner 와 freezed 를 pubspec.yaml 에 추가 필요 합니다.

 

terminal

dart pub add freezed_annotation
dart pub add --dev build_runner
dart pub add --dev freezed

# fromJson/toJson 생성도 사용하려면 아래를 추가
dart pub add json_annotation
dart pub add --dev json_serializable
  • build_runner: code-generators를 실행하기 위한 도구
  • freezed: code generator 
  • freezed_annnotation :  annotations을 포함하고 있는 패키지

 

 

 

그리고 모델 생성 후 명령어 실행하여 생성합니다.

 

terminal

dart run build_runner build

 

모델 생성

// 필수: `person.dart`를 Freezed에서 생성한 코드와 연결합니다.
part 'person.freezed.dart';

// 옵션(선택사항): Person 클래스는 직렬화 가능하므로 이 줄을 추가해야 합니다.
// 그러나 Person이 직렬화 가능하지 않은 경우 건너뛸 수 있습니다.
part 'person.g.dart';

@freezed
class Person with _$Person {
  const factory Person({
    required String firstName,
    required String lastName,
    required int age,
  }) = _Person;

  factory Person.fromJson(Map<String, Object?> json)
      => _$PersonFromJson(json);
}

 

 

  • 모델에 @freezed 또는 @unfreezed  annotate를 작성해야 합니다.
    @freezed - immutable
    @unfreezed - mutable
  • 접두사 _$ 가 붙은 클래스 이름과 mixin을 적용해야 합니다.
  • 생성자를 정의 할때는 factory 를 사용해야합니다.

 

 

 

출처 - https://pub.dev/packages/freezed

 

freezed | Dart Package

Code generation for immutable classes that has a simple syntax/API without compromising on the features.

pub.dev