Freezed feat Retrofit

BYSON STUDIO·2023년 9월 12일
0

Abstract

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

는 자동 생성 해주지 않는다.

Freezed를 사용하면 위 모두를 자동 생성 할 수 있어 편리하다

  • json serialize 도 enable/disable 할수 있어서 일반 모델 생성에도 사용 할 수 있다
  • 예를들면 BlocState

사용법

1. 패키지 추가

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

위 세개만 추가하면 된다

2. 기본 예시

우선 @freezed 와 @unfreezed를 살펴봐야 한다

@freezed
말그대로 모든 property가 immutable한 모델을 생성하겠다는것이고
immutable한 property들은 final 로 declare 된다.

@unfreezed
모든 properties가 mutable한 모델을 생성하겠다는것이다.
물론 나머지는 mutable 하게, 특정 property들만 immutable하게 하는것도 가능

ㄱ. person.dart - using @freezed

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 를
자동 생성 해준다

ㄴ. person.dart - using @unfreezed

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 를
자동 생성 해준다.

ㄷ. person.dart - using @unfreezed with some immutable properties

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 를
자동 생성 해준다.

3. Json Serializable

freezed로 자동 생성한 model에 toJson / fromJson도 자동으로 생성되게 하려면

ㄱ. 패키지 추가

flutter pub add json_annotation
flutter pub add --dev json_serializable

ㄴ. part *.g.dart 추가

우리의 경우엔 person.g.dart 추가

ㄷ. fromJson factory 추가

만 해주면 자동 생성 된다. 예를들면 아래와 같다

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);
}

0개의 댓글