概要
やりたいこと
freezed で Immutable (不変) なクラスを作成する。
題材は、公式の Example。
環境
- Flutter 2.8.1
- freezed 1.1.1
- freezed_annotation 1.1.0
- build_runner 2.1.7
freezed
freezed はクラスを Immutable にするもの。
Immutable にするべき理由は下記を参照。
freezed チュートリアル
freezed が生成する Immutable なクラスを利用するための流れ。
- freezed パッケージ群をインストール
- freezedアノテーションを付与した元ファイルを作成
- build_runner でコードを自動生成
- 生成されたコードを利用する
最初に feezed 用のプロジェクト作成。
flutter create example_freezed cd example_freezed
freezed パッケージ群をインストール
freezed と build_runner は開発段階でのみ必要となため、「dev_dependencies」に設定する。
生成されたコードは freezed_annotation を通して利用できる。
つまりパッケージ管理としては以下となる。
# pubspec.yaml
dependencies:
freezed_annotation:
dev_dependencies:
build_runner:
freezed:
もしくは CLI からインストールする場合は下記。
dev_dependencies
に freezed と build_runner を追加。
flutter pub add --dev build_runner flutter pub add --dev freezed
dependencies
に freezed_annotation を追加(json_annotation もここで追加)。
flutter pub add freezed_annotation
freezedアノテーションを付与した元ファイルを作成
main.dart を修正。サンプルだと main.dart だが user.dart や count.dart などのモデルに合った名前が良い。
vi lib/main.dart
今回作成する Union クラスは以下の特徴をもつ。
@freezed
アノテーションを指定factory MyClass
内に保持する変数を記載a
プロパティは String 型で Null を許容-
b
プロパティは Int 型で Null を許容
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:flutter/foundation.dart';
part 'main.freezed.dart';
@freezed
class MyClass with _$MyClass {
factory MyClass({String? a, int? b}) = _MyClass;
}
build_runner でコードを自動生成
build_runner 実行。
flutter pub run build_runner build --delete-conflicting-outputs
main.freezed.dart が作成される。
生成されたコードを利用する
part で生成されたファイルを指定する。
part 'main.freezed.dart';
通常通りにクラスを使っていくだけ。
- copyWith
- ==
- toString
- hashCode
実際に作っていくのはカウンターアプリを題材として次回。
公式 Example を動かす
公式 Example。
JSON_Serializable が必要(freezed_annotation 追加時に json_annotation は追加されている)。
flutter pub add --dev json_serializable
これで下記のように part 指定する。
part 'main.g.dart';
実行すると以下のようにコンソール上に実行結果が出力される。
% flutter run
Launching lib/main.dart on iPhone SE (2nd generation) in debug mode...
Running Xcode build...
└─Compiling, linking and signing... 15.8s
Xcode build done. 27.5s
flutter: MyClass(a: null, b: 42)
flutter: MyClass(a: 42, b: 42)
flutter: true
flutter: false
flutter: 42
flutter: 42
flutter: Union(value: 42)
flutter: fallthrough
flutter: Union(value: 42)
flutter: Union.loading()
flutter: Union.error(message: Failed to fetch)
flutter: Remi
flutter: London
Syncing files to device iPhone SE (2nd generation)... 43ms
Flutter run key commands.
r Hot reload. 🔥🔥🔥
R Hot restart.
h List all available interactive commands.
d Detach (terminate "flutter run" but leave application running).
c Clear the screen
q Quit (terminate the application on the device).
💪 Running with sound null safety 💪
Widget とか作ってるわけじゃないからシミュレータの方には何も出力されない。
コメント