이 글은 공식 문서와 유튜브 강의를 보고 배운 내용을 바탕으로 정리한 글입니다.
Freezed란?
데이터 클래스에서 필요한 기능들을 Code Generation으로 제공해주는 라이브러리이다(저번에 사용한 Retrofit과 같이 필요한 코드를 생성해준다). 몇가지 편리한 기능들을 제공해주는데 json_serializable, copy, toString override, assert 등 편의성 기능들을 제공해준다. 기능들이 상당히 많지만 강의를 보면서 사용한 기능들 위주로 작성해보았다.
pubspec.yaml에 다음과 같이 추가해준다.
pubspec.yaml
dependencies:
flutter:
sdk: flutter
freezed_annotation:
dev_dependencies:
flutter_test:
sdk: flutter
build_runner:
json_serializable:
freezed:
user.dart
import 'package:freezed_annotation/freezed_annotation.dart';
part 'user.g.dart';
part 'user.freezed.dart';
class User with _$User {
factory User({
required int id,
required String name,
required String job,
}) = _User;
factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
}
final user1 = User(id: 1, name: 'leeeeeoy', job: 'student');
print(user1.id);
print(user1.name);
print(user1.job);
// 1
// leeeeeoy
// student
final user1 = User(id: 1, name: 'leeeeeoy', job: 'student');
print(user1.toString());
print(user1.toJson());
// User(id: 1, name: leeeeeoy, job: student)
// {id: 1, name: leeeeeoy, job: student}
final user1 = User(id: 1, name: 'leeeeeoy', job: 'student');
final user2 = User(id: 1, name: 'leeeeeoy', job: 'student');
final user3 = User(id: 3, name: 'leeeeeoy', job: 'programer');
print(user1 == user2);
print(user1.hashCode == user2.hashCode);
print(user1 == user3);
// true
// true
// false
기본 기능들 이외에도 Assert, Custom method, getter, copy, deep copy를 지원한다.
class Member with _$Member {
('name.length < 6', '이름은 5글자 이하로 작성해주세요.')
factory Member({
required int id,
required String name,
}) = _Member;
}
final member1 = Member(id: 1, name: 'Yoel');
final member2 = Member(id: 1, name: 'leeeeeoy');
// assert에러 --> 이름은 5글자 이하로 작성해주세요
class Member with _$Member {
factory Member({
required int id,
required String name,
}) = _Member;
// Custom getter or method 작성을 위해 필요
Member._();
get nameLength => name.length;
void hello() {
print('Member의 Custom method 입니다.');
}
}
final member3 = Member(id: 1, name: 'leeeeeoy');
print(member3.nameLength);
member3.hello();
// 8
// Member의 Custom method 입니다.
class Member with _$Member {
factory Member({
required int id,
required String name,
required Team team,
}) = _Member;
}
class Team with _$Team {
factory Team({
required int id,
required String name,
required Company company,
}) = _Team;
}
class Company with _$Company {
factory Company({
required int id,
required String name,
}) = _Company;
}
final company1 = Company(id: 1, name: 'KAU');
final team1 = Team(id: 1, name: 'Ateam', company: company1);
final member1 = Member(id: 1, name: 'Yoel', team: team1);
// copy, id만 변경
final member2 = member1.copyWith(id:2);
// deep copy, Company의 name만 변경
final member3 = member1.copyWith.team.company(name: 'Kakao');
print(member2);
print(member3);
// Member(id: 2, name: Yoel, team: Team(id: 1, name: Ateam, company: Company(id: 1, name: KAU)))
// Member(id: 1, name: Yoel, team: Team(id: 1, name: Ateam, company: Company(id: 1, name: Kakao)))
써보지는 않았지만 공식 문서를 참고해보면 여러가지 기능들이 많이 있는 것 같다. 그 중 몇가지를 정리해보았다.
abstract class Example with _$Example {
const factory Example([(42) int value]) = _Example;
}
class Person with _$Person {
factory Person({
required int id,
required String name,
required int age,
required int statusCode,
}) = _Person;
factory Person.loading({required int statusCode}) = _Loading;
factory Person.error(String message, {required int statusCode}) = _Error;
}
저번에 사용해본 retrofit과 마찬가지로 상당히 편리한 기능들이 많이 있는 것 같다. 작성해야 할 코드가 줄어드는 것만 해도 이미 좋아보인다. 아마 retrofit과 freezed 둘 다 적용해서 사용하면 더 편리하게 사용이 가능 할 것 같다. 다음에 한 번 적용해 봐야겠다.
소스코드 https://github.com/leeeeeoy/flutter_personal_study/tree/master/lib/pages/freezed
참고링크