[Flutter] freezed를 활용한 데이터 모델 생성

Raon·2023년 5월 3일
0

Flutter

목록 보기
15/24
post-thumbnail

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객체를 생성할 때도 사용할 수 있다.

profile
Flutter 개발자

0개의 댓글