備忘録です。必要最低限の理解なので、追加で技術が必要になったとき追記していきます。
Freezeとは
Freezedは、DartとFlutterの開発者が利用するパッケージの1つで、Dart言語の特性を活かして不変なモデルを簡単に作ることができます。また、union/sealed classesのパターンマッチング、copyWithメソッド、比較、ハッシュ、toStringをサポートしています。
導入するもの
以下全てを導入する必要があります。
freezed_annotation

build_runner

freezed

実装方法
不変のモデルを定義するためには以下のようにします。
必要なdartファイルはこれだけです。
import 'package:freezed_annotation/freezed_annotation.dart';
part 'user.freezed.dart';
part 'user.g.dart';
@freezed
class User with _$User {
factory User({
required String name,
required int age,
}) = _User;
factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
}
@freezed
というアノテーションを使用しています。そして、factoryコンストラクターを使用してUserクラスを定義します。ここでは、”name”と”age”という2つのフィールドを持つUserクラスを定義しています。
そして、以下のコマンドを実行して、自動生成のコードを作成します。
flutter pub run build_runner build
このコマンドを実行すると、‘user.freezed.dart’と‘user.g.dart’という2つのファイルが生成されます。
生成されたコードには、自動的に==
、hashCode
、toString
メソッドが実装され、また、各フィールドに対してcopyWith
メソッドも提供されます。また、User.fromJson
メソッドがあるので、JSONからUserオブジェクトを簡単に作成することも可能です。
Union/Sealed classesの機能は、複数の異なる状態を持つオブジェクトを表現するときに便利です。例えば次のようなWeather
クラスを考えてみましょう。
@freezed
class Weather with _$Weather {
factory Weather.sunny() = _Sunny;
factory Weather.rainy(int rainfall) = _Rainy;
}
これは、天気が晴れ(Sunny
)か雨(Rainy
)かを表すクラスです。そして雨の場合はその降水量も情報として持っています。そして、この天気の状態に応じた処理をパターンマッチングで行うことができます。
final weather = Weather.sunny();
weather.when(
sunny: () => print('It is sunny'),
rainy: (rainfall) => print('It is raining, rainfall: $rainfall'),
);
このように、FreezedパッケージはDartとFlutter開発における不変のモデルの定義や、複数の状態を持つオブジェクトの処理を簡単に、安全に行うことができる強力なツールです。