Kinokのブログ

しゃかいじん。

Dartでオブジェクトを等値比較しよう

概要

OOPでプログラミングしていく場合、宣言的にUIを構築できるのがメリットの一つかと思われます。

 

雑なユースケースですが、Userインスタンスが自分だった場合に処理や見た目を変えるなど。

 

Userインスタンスのid(それかインスタンス)を見て比較するわけですが、プリミティブな型でidを保持するのは少々危険かと思います。

 

dartインスタンス同士を比較する

 

By default, == returns true if two objects are the same instance.

pub.dev

 

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でちょっとアレンジしてみるのもいいかもしれないです。

hachibeechan.hateblo.jp

まとめ

この辺のOOPやる上で必要な知見とかもっと深めていきたいですね。(KONAMI

*1:多分

*2:まるパクりです