見出し画像

[Flutter]freezedパッケージの@Default()にMatrix4を定義する方法


はじめに

freezedパッケージで、デフォルトの値を設定すると思うのですが、Matrix4の値って、どうやってデフォルト設定すればいんだろうと思って悩んだので備忘録として記載します。

正しいコードの記載例

結論、こんな感じに書くとOKです。

@freezed
abstract class HomeState with _$HomeState {
  const factory HomeState({
    Matrix4? transform,
  }) = _HomeState;

  const HomeState._();

  factory HomeState.withDefaults() {
    return HomeState(transform: Matrix4.identity());
  }
}

自分がやった間違いの記載例

@freezed
abstract class HomeState with _$HomeState {
  const factory HomeState({
    @Default(Matrix4.indetity()) Matrix4 transform,
  }) = _HomeState;

  const HomeState._();
}

ダメな理由
Matrix4は、定数ではないから。
@Defaultアノテーションは、コンパイル時に評価される定数を要求します。
しかし、Matrix4は、実行時に評価される関数呼び出しである為、扱うことができない。ということでした。

.withDefaults()メソッドはこの為にある!

Matirix4は、実行時に評価されるから、@Defaultアノテーションでは設定できないのか。じゃあどうしよう。。。ということになるのですが、ここで出てくるのが、.withDefaults()メソッドです。
.withDefaults()メソッドは、特定のデフォルト値を持つインスタンスを生成することができます。
HomeState.withDefaults()は、HomeStateクラスのインスタンスを生成する際に、明示的にデフォルト値を設定する目的で用意されています。

最後に

ということで、どうしてもデフォルト値が上手くいかないと思ったら、それは定数なんじゃ無いかと疑って、そうだとしたら、.withDefaults()メソッドを使って対処してきましょう。


いいなと思ったら応援しよう!