今回は、flutterアプリにimmutableなデータ管理を簡単にするfreezedを追加したいと思います。
参考文献
- 以下のパッケージを使用します。
- pub.dev
- 上記リンクの
Readme
には細かい使い方の注意が記載されています。
freezedとは
上記リンクには一番最初に以下のような記述がありました。
Welcome to Freezed, yet another code generator for data-classes/unions/pattern-matching/cloning. (データクラス/ユニオン/パターンマッチング/クローン作成のためのさらに別のコードジェネレーターである)
さらに原文の翻訳結果を記載しておきます
Dart は素晴らしいですが、「モデル」を定義するのは面倒な場合があります。次のことを行う必要があるかもしれません。
- コンストラクター + プロパティを定義する
- 上書きtoString、、operator ==_hashCode
- copyWithオブジェクトのクローンを作成するメソッドを実装する
- 逆シリアル化の処理
これらすべてを実装するには数百行かかる可能性があり、エラーが発生しやすく、モデルの可読性に大きな影響を与えます。
Freezed は、これらのほとんどを実装することで問題を修正し、ユーザーがモデルの定義に集中できるようにします。
私は「 モデル定義やモデル管理のコードの大部分を自動生成してくれるコードジェネレータ 」と理解しました
使用するパッケージ
- 以下のパッケージを使用します。
- pub.dev
- 上記リンクの
Readme
には細かい使い方の注意が記載されています。
手順
手順1:freezedのパッケージを追加
私はfvmを導入しているので以下のコマンドでパッケージを追加しました。
fvm flutter pub add freezed_annotation fvm flutter pub add dev:build_runner fvm flutter pub add dev:freezed # if using freezed to generate fromJson/toJson, also add: fvm flutter pub add json_annotation fvm flutter pub add dev:json_serializable
コマンド実行結果(freezed_annotation)
(省略)\training_app> fvm flutter pub add freezed_annotation Resolving dependencies... _fe_analyzer_shared 64.0.0 (65.0.0 available) analyzer 6.2.0 (6.3.0 available) flutter_lints 2.0.3 (3.0.1 available) freezed_annotation 2.4.1 (from transitive dependency to direct dependency) js 0.6.7 (0.7.0 available) lints 2.1.1 (3.0.0 available) matcher 0.12.16 (0.12.16+1 available) material_color_utilities 0.5.0 (0.8.0 available) meta 1.10.0 (1.11.0 available) path 1.8.3 (1.9.0 available) test_api 0.6.1 (0.7.0 available) web 0.3.0 (0.4.0 available) Changed 1 dependency! 11 packages have newer versions incompatible with dependency constraints. Try `flutter pub outdated` for more information.
コマンド実行結果(dev:build_runner)
(省略)\training_app> fvm flutter pub add dev:build_runner Resolving dependencies... _fe_analyzer_shared 64.0.0 (65.0.0 available) analyzer 6.2.0 (6.3.0 available) + build_daemon 4.0.1 + build_resolvers 2.4.2 + build_runner 2.4.7 + build_runner_core 7.2.11 + built_collection 5.1.1 + built_value 8.8.1 + code_builder 4.9.0 + fixnum 1.1.0 flutter_lints 2.0.3 (3.0.1 available) + frontend_server_client 3.2.0 + graphs 2.3.1 + http_multi_server 3.2.1 + http_parser 4.0.2 + io 1.0.4 js 0.6.7 (0.7.0 available) lints 2.1.1 (3.0.0 available) matcher 0.12.16 (0.12.16+1 available) material_color_utilities 0.5.0 (0.8.0 available) meta 1.10.0 (1.11.0 available) + mime 1.0.4 path 1.8.3 (1.9.0 available) + pool 1.5.1 + shelf 1.4.1 + shelf_web_socket 1.0.4 + stream_transform 2.1.0 test_api 0.6.1 (0.7.0 available) + timing 1.0.1 web 0.3.0 (0.4.0 available) + web_socket_channel 2.4.0 (2.4.1 available) Changed 20 dependencies! 12 packages have newer versions incompatible with dependency constraints. Try `flutter pub outdated` for more information.
コマンド実行結果(dev:freezed)
(省略)\training_app> fvm flutter pub add dev:freezed Resolving dependencies... _fe_analyzer_shared 64.0.0 (65.0.0 available) analyzer 6.2.0 (6.3.0 available) flutter_lints 2.0.3 (3.0.1 available) + freezed 2.4.6 js 0.6.7 (0.7.0 available) lints 2.1.1 (3.0.0 available) matcher 0.12.16 (0.12.16+1 available) material_color_utilities 0.5.0 (0.8.0 available) meta 1.10.0 (1.11.0 available) path 1.8.3 (1.9.0 available) + source_gen 1.5.0 test_api 0.6.1 (0.7.0 available) web 0.3.0 (0.4.0 available) web_socket_channel 2.4.0 (2.4.1 available) Changed 2 dependencies! 12 packages have newer versions incompatible with dependency constraints. Try `flutter pub outdated` for more information.
コマンド実行結果(json_annotation)
(省略)\training_app> fvm flutter pub add json_annotation Resolving dependencies... _fe_analyzer_shared 64.0.0 (65.0.0 available) analyzer 6.2.0 (6.3.0 available) flutter_lints 2.0.3 (3.0.1 available) js 0.6.7 (0.7.0 available) json_annotation 4.8.1 (from transitive dependency to direct dependency) lints 2.1.1 (3.0.0 available) matcher 0.12.16 (0.12.16+1 available) material_color_utilities 0.5.0 (0.8.0 available) meta 1.10.0 (1.11.0 available) path 1.8.3 (1.9.0 available) test_api 0.6.1 (0.7.0 available) web 0.3.0 (0.4.0 available) web_socket_channel 2.4.0 (2.4.1 available) Changed 1 dependency! 12 packages have newer versions incompatible with dependency constraints. Try `flutter pub outdated` for more information.
コマンド実行結果(dev:json_serializable)
(省略)\training_app> fvm flutter pub add dev:json_serializable Resolving dependencies... _fe_analyzer_shared 64.0.0 (65.0.0 available) analyzer 6.2.0 (6.3.0 available) flutter_lints 2.0.3 (3.0.1 available) js 0.6.7 (0.7.0 available) + json_serializable 6.7.1 lints 2.1.1 (3.0.0 available) matcher 0.12.16 (0.12.16+1 available) material_color_utilities 0.5.0 (0.8.0 available) meta 1.10.0 (1.11.0 available) path 1.8.3 (1.9.0 available) + source_helper 1.3.4 test_api 0.6.1 (0.7.0 available) web 0.3.0 (0.4.0 available) web_socket_channel 2.4.0 (2.4.1 available) Changed 2 dependencies! 12 packages have newer versions incompatible with dependency constraints. Try `flutter pub outdated` for more information.
手順2:実装
- 省略(実装したときに追記するかもしれない)
手順3:コード生成
fvm flutter pub run build_runner build
コマンド実行結果
(省略)\training_app> fvm flutter pub run build_runner build [INFO] Generating build script... [INFO] Generating build script completed, took 442ms [INFO] Precompiling build script...... [INFO] Precompiling build script... completed, took 7.3s [INFO] Initializing inputs [INFO] Building new asset graph... [INFO] Building new asset graph completed, took 2.8s [INFO] Checking for unexpected pre-existing outputs.... [INFO] Checking for unexpected pre-existing outputs. completed, took 1ms [INFO] Running build... [INFO] Generating SDK summary... [INFO] 2.8s elapsed, 0/10 actions completed. [INFO] 5.0s elapsed, 0/10 actions completed. [INFO] 6.1s elapsed, 0/10 actions completed. [INFO] Generating SDK summary completed, took 6.1s [INFO] 7.2s elapsed, 18/34 actions completed. [INFO] 8.3s elapsed, 30/46 actions completed. [INFO] 16.5s elapsed, 43/54 actions completed. [INFO] Running build completed, took 17.5s [INFO] Caching finalized dependency graph... [INFO] Caching finalized dependency graph completed, took 101ms [INFO] Succeeded after 17.6s with 48 outputs (126 actions)
特にコードを実装していない状態でしたが、上記出力がありました