Freezed 라이브러리 사용

테디준·2022년 8월 20일
0

요즘 코딩 트렌드는 한 번 만들어지면 변경이 불가능해야 한다. 그래서 원천적으로 수정을 차단하기 위해 sealed Class로 만든다.

1. Freezed 라이브러리 특징

- 불변(immuatable) 객체
- 패턴 매칭 지원 (when)
- fromJson(), toJson() 자동 생성
- Sealed Class 생성 지원

2. Freezed 라이브러리 세팅

flutter pub add freezed_annotation
flutter pub add --dev build_runner
flutter pub add --dev freezed
flutter pub add json_annotation
flutter pub add --dev json_serializable

💯 analysis_options.yaml에 들어가 아래와 같은 코드를 빼먹지 말고 넣어야 한다.

analyzer:
  exclude:
    - lib/**.g.dart
    - lib/**.freezed.dart
  errors:
    invalid_annotation_target: ignore
더 자세한 사항은 공식문서를 참조하기 바란다.
Freezed 공식문서

3. Freezed를 위한 Live Template을 만든다.

Settings -> Editor -> Live Template을 들어간다. Flutter에 체크한 뒤 추가버튼을 누른다. 그리고 Abbreviation 부분에 dataclass로 지정한다.
import 'package:json_annotation/json_annotation.dart';

part '$NAME$.g.dart';

(explicitToJson: true)
class $CAP_NAME$ {
  $END$
  
  $CAP_NAME$();
  
  factory $CAP_NAME$.fromJson(Map<String, dynamic> json) => _$$$CAP_NAME$FromJson(json);
 }
Define부분을 반드시 Dart로 체크해줘야 한다.

이 부분은 꼭 해줘야 하는데, 이유는 Camel Case를 snake Case로 바꿔준다는 내용이기 때문이다.
import 'package:freezed_annotation/freezed_annotation.dart';
part 'photo.freezed.dart';
part 'photo.g.dart';


class Photo with _$Photo {
  const factory Photo({
    required String previewURL;
    required String tags;
  }) = _Photo;

  factory Photo.fromJson(Map<String, Object?> json) => _$PhotoFromJson(json);
}
이렇게 Model 클래스를 제대로 만들었다면 터미널에 flutter pub run build_runner build를 해준다. State(상태) 부분을 모았다면 상태 앞에 디폴트 값을 지정할 수 있다.

4. 값 변경시 방법

깊은 복사를 해서 필요한 것만 바꾼다.
_state = state.copyWith(
isLoading : true //여기에 바꿀 부분이 들어간다.
);
이전 처럼 아래와 같이 써도 sealed Class로 전환되어 값을 바뀌지 않는다.
_state.isLoading = true;
notifyListener();

5. action은 무조건 when으로 쓴다.

void onAction(MainAction action) {
    action.when(
        getSearchedMovies: (query) {
          fetchSearchedMovie(query); 
        },
        error: (e) {});
  }

0개의 댓글