freezed
を使う理由は、ネストを避けて状態管理に安全性を求める為です。要はコードが整理整頓しやすくなります。
Android Studio
のプラグインを使用した方が良いのでしょうが、VS code
でのFlutter開発が慣れているので、変更の都度下記コマンドでGenerator
を走らせながらfreezed
を使って参ります。
flutter clean
// エラーが他にある場合、そのファイル群を削除するのに使用
flutter pub get
// ライブラリが更新されていない場合に必要。
flutter packages pub run build_runner build --delete-conflicting-outputs
// freezedのエラー処理とXXXX.freezed.dartの生成。
dev_dependencies:
build_runner: ^latest
バージョン管理にかかせないfvm
というパーケージ管理ライブラリを、プロジェクトのルート直下にMakefile
を置いてそこに上記の処理と合わせて
.PHONY: build
build:
fvm flutter pub run build_runner build --delete-conflicting-outputs
と書くだけで、make build
とターミナルで打つだけで実行することができます。もし、開発のペースにゆとりがあれば、このようにpub get
も書き加えて!
.PHONY: build
build:
fvm flutter pub get
fvm flutter pub run build_runner build --delete-conflicting-outputs
行を増やして簡略化しましょう。
Freezed
はプロパティを宣言せず、ファクトリコンストラクタを用いてクラスを定義します。
@freezed
class Dog with _$Dog {
factory Dog({ String? name , int? age }) = _Dog;
}
// 名前(String)と年齢(int)の2つのプロパティを持つクラス
こちらを使用するには、
var dog = Dog(name: 'KenKen', age: 8);
print(dog.name); -> // KenKen
print(dog.age); -> // 8
このように書けば使用できます。また、パラメータの型がサポートされているので
@freezed
class Dog with _$Dog {
const factory Dog( String name , int age, {String? dog_breed }) = _Dog;
}
Dog('KenKen', 8, dog_breed: 'Shiba')
// ケンケンという8歳の柴犬がパラメータ。
このようにも書けます。dartのデータ型の多くはイミュータブル(状態を変更することができないオブジェクト)でfreezed
はそのデータ型を自動生成して扱いやすくしてくれます。Dog
のクラスのnameプロパティに名前無し
デフォルト値を与える場合は次のように書きます。
@freezed
abstract class Dog with _$Dog {
const factory Dog({
@Default('名前無し') String name,
int age,
bool young,
}) = _Dog;
}
final dog = Dog(age: 8, young: false);
print(dog.name); // 名前無し
と他にも色々な使い方があるのでこちらの記事に後から追加していきたいと思います。