상태관리 라이브러리 이해하기
Freezed
- 불변성 모델클래스를 쉽게 만들어준다.
- 반복적인 코드를 자동으로 생성해주는 도구
- JSON직렬화와 함께 사용하는 API모델을 만들 때 필수 사용
모델클래스를 구현할 때 RiverPod같은 상태관리 라이브러리를 쓸 때 이 패턴이 필수적인데
final로 선언된 필드는 수정할 수 없어서 불변성을 가지지만
copyWith로 상태를 변경한 값을 받을 수 있게 된다.
상태변경에 대해서도 감지를 할 수 있어야 화면을 새로 그려낸다.
class AppTodo {
final String id;
final String title;
final DateTime scheduleAt; // 날짜+시간
const AppTodo({
required this.id,
required this.title,
required this.scheduleAt,
});
AppTodo copyWith({String? id, String? title, DateTime? schduleAt}) {
return AppTodo(
id: id ?? this.id,
title: title ?? this.title,
scheduleAt: scheduleAt,
);
}
}
단점:
직접 작성 시 번거롭고 실수할 확률이 올라가게 된다.
freezed같은 코드생성 라이브러리를 사용하면
copyWith, toString, equals를 자동으로 생성해서 사용해준다.
패키지 추가 후 pubspec.yaml 파일에서 필요한 의존성 추가. 최신버전인지도 확인하기
freezed_annotation: ^3.0.0
@freezed 어노테이션을 사용해서 모델을 정의
class AppTodo with _$AppTodo {
const factory AppTodo({
required String id,
required String title,
required DateTime scheduleAt,
}) = _AppTodo;
}
해당 모델은 앱에 리스트를 추가하기 위한 기본타입이어서 별도 외부 패키지가 필요한 규모는 아님
바꾸고 싶은 것만 매개변수로 넘기고 나머지는 null로 두는 것인데
-> 값이 null이 와도 된다 X
-> 변경할 값이 없다면 기존의 값을 쓰겠다 O
수정하고 싶을 때만 값을 넘기기 때문에 기존 값을 유지하면서 안전하게 교체할 수 있고,
null값이 전달되어도 ?? 연산자를 통해 기존 객체의 값을 사용하기 때문에 항상 유효한 값을 가질 수 있게된다.