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

Flutter

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

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つのファイルが生成されます。

生成されたコードには、自動的に==hashCodetoStringメソッドが実装され、また、各フィールドに対して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'),
);

Buy me a coffee!

Flutterアプリ開発
シェアする
sogaをフォローする
タイトルとURLをコピーしました