🦔

【Flutter】Bad state: Tried to use ○○○ after `dispose` was called.の解決法

2022/06/12に公開1

今回もflutterでアプリを作っている最中に出会ったバグが解決できたのでその方法について紹介します。

問題

以下がその時表示されたエラーメッセージです。プロバイダ名はエラーが出たプロバイダの名前です。
あるプロバイダを使おうとしたが既に捨てられているみたいなことを言われています。

Exception has occurred.
StateError (Bad state: Tried to use プロバイダ名 after `dispose` was called.

Consider checking `mounted`.
)

原因

プログラムの中では以下のような順番で実行されていました。問題はstateNotifierプロバイダーが更新されるようなアクションの後にメソッドを呼び出していたことでした。
どうやら、providerが更新されるタイミングで古いものはdispose、つまり捨てられてしまうみたいです(この辺りの知識は曖昧です。すみません)。

# providerの宣言
final stateNotifier = ref.watch(stateNotifierProvider.notifier);
...
# providerが更新されるようなアクション
...
# providerのメソッドの使用
stateNotifier.メソッド名;

解決法

解決法は簡単でproviderが更新された後にstateNotifierプロバイダーを宣言してあげることで解決できました。こうするとメソッドを使う前にdisposeされる心配はなくなります。もしくはproviderの宣言をやめて"ref.watch(プロバイダ名.notifier).メソッド名"と毎回書いてもいいのかもしれません。

...
# providerが更新されるようなアクション
...
# providerの宣言 (順番を入れ替えた)
final stateNotifier = ref.watch(stateNotifierProvider.notifier);

# providerのメソッドの使用
stateNotifier.メソッド名;

まとめ

どうでしたでしょうか。誰かの時短に貢献できていたら幸いです。

Discussion