【Flutter】Freezedについて最速で理解してみた

更新

備忘録です。必要最低限の理解なので、追加で技術が必要になったとき追記していきます。

Freezedとは

Freezedは、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'),
);