MOB-LOG

モブおじの記録 (Programming, 統計・機械学習)

Flutterでのオブジェクト同一性の確認 identityHashCode

Firebase上の値を参照してオブジェクトを操作しているとき、FlutterでsetStateなどリビルドの際にオブジェクトを不本意に初期化していたりすると、同一オブジェクトを扱っていると思っていても実は違うオブジェクトでした(setState前の変更が引き継がれなかったり)、ということが起こる(自分は気を付けていても時々間違えるし、ほかの誰かが間違える)。

デバッグをしていて、同じスコープで参照できるオブジェクトを確認したい時は、ブレークポイントで停まったときにdebug consoleで単純にobjA == objBとして確認したらよい。

ただし今回のような場合はスコープが異なったり、setState前後のリビルドでかオブジェクトの実態が異なるかどうかを調べるためには、==を用いてその場で比較はできない。DartではobjA == objB の様にObjectの一致確認を行う際にメモリ上のアドレスやらを確認している様子なので、メモリのアドレスを取得しようとしたがDart/Flutterにはそのような機能はないらしい。

ドキュメントを調べると、今回の場合のような異なるスコープで、あるオブジェクトobjの同一性を確認するには、identityHashCode()によるハッシュ値を使用すればいいらしい。調べたい場面でブレークして、identityHashCode(obj)とするだけ。

ハッシュ値が返ってくるので、Stringで比較できる。