🕌

【謎エラー】Bad state: Tried to use XXX after `dispose` was called.

2023/01/24に公開

StateNotifierは非同期処理中に再構築されるの??
そんな事をレミさんが言ってるように思えるけど、よく分からん。なんこれ。

https://github.com/rrousselGit/riverpod/issues/496

It sounds like this is a bug in your logic instead
It is likely that your StateNotifier was rebuilt during an await, before of the ref.watch.
Consider passing ProviderReference to your StateNotifier and use ref.read instead.

翻訳:
これは、あなたのロジックのバグのようです。
StateNotifierがawait中に再構築され、ref.watchの前に再構築された可能性があります。
StateNotifierにProviderReferenceを渡して、代わりにref.readを使うことを検討してみてください。

実際に、これとほぼ同じような感じのエラーに遭遇し、色々と調べてると
さっぱりわからないって事が分かりました。

エラー文を検索すると一番上位に下記のサイトが出てくるが
自分の中では、うーん。って感じであまり参考にならなかった。
多分、非同期処理時点でのエラーっぽくなかったからかなぁ。知らんけど。

https://zenn.dev/sciotein/articles/79059ff68c40bb

原因

実は検証していないから分からん。
というのも、別にStateNotifierなんか使わなくても済む問題だったから逃げた。

ざっくり、どんな感じのシーンだったかというと、
・チャットを監視している状態(autoDispose採用している)
・チャットを送信する
・チャットを離れる
・再度チャットを開いて、監視して、適当に何か送信する
・チャットの監視処理内でエラー
って感じだった。

本当は、StateNotifier内で監視してリッスンした処理をstateに突っ込む
みたいな処理をしてたけど、チャットを全て監視する設計にしたから
とりまStreamProviderでチャットは監視すればええやって思ってそうした。

今後

おそらく、ユーザーが増えた時のことを考えると、
StateNotifierの中で

・最新のチャットを監視する
・最後に取得した日付以降のチャットを監視する(limit(1))

とかの設計に変わる気はするが、、、

stateに突っ込む内容で変な物を入れなければ問題ないと勝手に思ってる。
というのも、監視処理が問題なのではなく、その処理内でstateに突っ込む内容でエラーになると思っているから。

実際に、今までちゃんと監視している処理は正常に動いていたから。

だからこそ、よく分からん。謎のエラー。なんやねんこれ。
解決するけど、原因が不明過ぎるが故にモニャモニャする。

Discussion