備忘録です。必要最低限の理解なので、追加で技術が必要になったとき追記していきます。
Freezeとは
Freezedは、Dart言語の特性を活かして不変なモデルを簡単に作ることができます。
また、union/sealed classesのパターンマッチング、copyWithメソッド、比較、ハッシュ、toStringをサポートしています。
導入するもの
以下全てを導入する必要があります。
freezed_annotation
freezed_annotation | Dart package
Annotations for the freezed code-generator. This package does nothing without freezed too.
build_runner
build_runner | Dart package
A build system for Dart code generation and modular compilation.
freezed
freezed | Dart package
Code generation for immutable classes that has a simple syntax/API without compromising on the features.
実装方法
不変のモデルを定義するためには以下のようにします。
必要な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'),
);