Chapter 08

8. freezedで値を格納するクラスを作ろう

antman
antman
2021.12.01に更新
このチャプターの目次
todo_model.dart
import 'package:(アプリ名)/model/db/todo_db.dart';
import 'package:freezed_annotation/freezed_annotation.dart';

part 'todo_model.freezed.dart';


abstract class TodoStateData with _$TodoStateData {
  //このクラスは、DBの状態を保持するクラスです。
  factory TodoStateData({
    (false) bool isLoading,
    (false) bool isReadyData,
    ([]) List<TodoItemData> todoItems,
  }) = _TodoStateData;
}


abstract class TempTodoItemData with _$TempTodoItemData {
  //このクラスは、入力中のtodoを保持するクラスです。
  factory TempTodoItemData({
    ('') String title,
    ('') String description,
    (null) DateTime? limit,
    (true) bool isNotify,
  }) = _TempTodoItemData;
}

もうおわかりですね、@Defaultがデフォルトの値を表し、あとは横に型と変数名をかけばいいだけです。
これだけでimmutableなクラスを作れてしまいます。
まあimmutableっていきなり聞いてもなんぞやって話なのですが。
例えばこのようなmutableなクラスがあったとします。

class Mutable {
  Mutable(this.value);
  int value;
}
void main() {
  test('mutable', () {
    final x1 = Mutable(1);
    final x2 = x1;
    x1.value++;
    print(x1.value);
    //結果:2
  });
}

これではx1の値もx2につられて変化してしまいます。
これではバグが生まれてしまう可能性が多くなります。
要するにimmutableは予期せぬ値の変更を防ぎ、結果的にバグが生まれにくくなるのです。
また、freezedはcopyWithを使えるように勝手にしてくれます。

User user4 = user1.copyWith(name: "unknown");

freezedでUserというクラスを作った場合。このように簡単に値の変更を行えます。
他のimmutableなクラスを作る方法を調べて貰えばわかるのですが、これがかなり便利です。
ある程度解説も終わったので前回と同じく以下のコマンドを実行してみてください。

flutter packages pub run build_runner build

これでクラスの作成作業は終わりです。

まとめ

今回はfreezedを使って値を格納するクラスを作りました。次の章では何時間前に通知するかを保存するための作業を行います。