Programming Self-Study Notebook

勉強したことを忘れないように! 思い出せるように!!

flutterアプリにimmutableなデータ管理を簡単にするfreezedを追加する


今回は、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)

特にコードを実装していない状態でしたが、上記出力がありました