Open1

【Flutter】freezedファイルと.g.dartファイル

Azusa UtayaAzusa Utaya

1. freezedファイルの役割

不変なデータクラス(イミュータブルクラス)を自動生成するパッケージ。freezedファイルは、以下のような機能を提供する。

a. 不変なデータクラスの生成

データクラスを簡単に定義でき、freezedはそのクラスが不変であることを保証する。
例えば、StoreUserのようなクラスを変更不可にして扱いたい場合、freezedを使うことで簡単にそのクラスを作成することができる。

b. コピー機能の自動生成

freezedは、変更したいプロパティだけを指定してコピーを作成するためのcopyWithメソッドを自動生成してくれる。これにより、オブジェクトを変更する際に、新しいオブジェクトを作成しつつ、特定のフィールドだけを更新することができる。

final updatedUser = storeUser.copyWith(email: 'newemail@example.com');

c. パターンマッチングのサポート

freezedは、パターンマッチング(whenmaybeWhen)をサポートしている。これにより、複数の状態を持つクラス(例えば、SuccessFailureなどの状態)を簡単に扱うことができる。

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

2. .g.dartファイルの役割

.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との変換を簡単にするためのファイル