概要
OOPでプログラミングしていく場合、宣言的にUIを構築できるのがメリットの一つかと思われます。
雑なユースケースですが、Userインスタンスが自分だった場合に処理や見た目を変えるなど。
Userインスタンスのid(それかインスタンス)を見て比較するわけですが、プリミティブな型でidを保持するのは少々危険かと思います。
dartはインスタンス同士を比較する
By default,
==
returns true if two objects are the same instance.
dartではclassのoperatorというメンバをoverrideすることで、独自の比較を設定できます。
ただ、全てのclassをoverrideするのはめんどくさいのでEquatableパッケージを利用するのが主流です。*1
こんな感じでEqutableクラスを継承して、抽象化したクラスを用意します。
abstract class UniqueKey extends Equatable {
@protected
final String id;
const UniqueKey(this.id);
@override
List<Object> get props => [id];
}
利用する側ではこのような感じ。
class TodoId extends UniqueKey {
const TodoId(String id) : super(id);
}
@freezed
class Todo with _$Todo {
const factory Todo({
@Default(TodoId('')) TodoId id,
@Default('') String description,
@Default(false) bool completed,
}) = _Todo;
const Todo._();
}
なお、こういったFlutterに関するアイデアはhatchinさんという方からインスパイアを受けました。*2
hatchinさんはflutterでfluxアーキテクチャを実現していたのですが、これがすごく良い開発体験でした。(一緒に働いていたわけではないです。人生いろいろあるじゃないですか。)
mvvmとかよくわからないのですが、flutterにおいてはfluxが最適解なんじゃ?と思わずにはいられないほど。。
許可が取れたら今後も発信していきたいですね。。
すでに記事にされてるので、riverpodでちょっとアレンジしてみるのもいいかもしれないです。