【Flutter】freezedファイルと.g.dartファイル
freezed
ファイルの役割
1. 不変なデータクラス(イミュータブルクラス)を自動生成するパッケージ。freezed
ファイルは、以下のような機能を提供する。
a. 不変なデータクラスの生成
データクラスを簡単に定義でき、freezed
はそのクラスが不変であることを保証する。
例えば、StoreUser
のようなクラスを変更不可にして扱いたい場合、freezed
を使うことで簡単にそのクラスを作成することができる。
b. コピー機能の自動生成
freezed
は、変更したいプロパティだけを指定してコピーを作成するためのcopyWith
メソッドを自動生成してくれる。これにより、オブジェクトを変更する際に、新しいオブジェクトを作成しつつ、特定のフィールドだけを更新することができる。
final updatedUser = storeUser.copyWith(email: 'newemail@example.com');
c. パターンマッチングのサポート
freezed
は、パターンマッチング(when
やmaybeWhen
)をサポートしている。これにより、複数の状態を持つクラス(例えば、Success
やFailure
などの状態)を簡単に扱うことができる。
state.when(
success: (data) => print(data),
failure: (error) => print(error),
);
d. 等価比較の自動生成
通常のDartのクラスでは、オブジェクトの等価性を比較するには自分で==
演算子をオーバーライドする必要があるが、freezed
はそれを自動的に実装してくれる。これにより、オブジェクト同士を比較する際にフィールドごとの値を考慮して等価性を判定することができる。
final user1 = StoreUser(id: '1', email: 'test@example.com');
final user2 = StoreUser(id: '1', email: 'test@example.com');
print(user1 == user2); // true
.g.dart
ファイルの役割
2. .g.dart
ファイルは、主にjson_serializable
パッケージを利用して、クラスをJSONにシリアライズ(変換)したり、逆にJSONからクラスをデシリアライズするためのコードを自動生成する。
JSONシリアライズ・デシリアライズの自動生成
FirestoreやAPIからデータをやり取りする際、JSON形式のデータを扱うことが多いが、.g.dart
ファイルは、そのクラスをJSON形式に変換するためのtoJson
、およびJSONからそのクラスのインスタンスを生成するfromJson
メソッドを自動的に生成してくれる。
final json = storeUser.toJson();
final storeUserFromJson = StoreUser.fromJson(json);
つまり
freezed
ファイルは不変データクラスを簡単に作成し、コピーやパターンマッチングをサポートするためのファイルです。
.g.dartファイルは、json_serializableを使って、JSONとの変換を簡単にするためのファイル