[Flutter] Provier関連のエラー解決方法

ひさびさにFlutter開発やってみたらProviderの仕様が変わっててちょっとハマりました。

エラー内容と解決方法だけの備忘録のメモ。

Providerってなんなのか理解したい、って方は以下の記事にわかりやすくまとめてありますのでご覧ください^^

へっぽこSEが◯時間でFlutter(iOS、android、web)で2Dゲームアプリを作ってみる(13)

ちなみに、私はコミュ障ぼっちでフリーランスのエンジニアをやっています、34歳です。私のプロフィールに興味を持ってくださった方は、ページ下部の筆者紹介、Twitter(@suekiaoi)やInstagram(@aoi.sueki)などからご確認いただければと思います。

また、ぼっち社会人向けに1年かけて書いていたコラムが書籍化されました。ぜひ一度、お手にとって読んでみてください。

友達0のコミュ障が「一人」で稼げるようになったぼっち仕事術 (アルファポリス)

 

■エラー内容

[VERBOSE-2:ui_dart_state.cc(186)] Unhandled Exception: ‘package:provider/src/provider.dart’: Failed assertion: line 262 pos 7: ‘context.owner.debugBuilding ||
listen == false ||
debugIsInInheritedProviderUpdate’: Tried to listen to a value exposed with provider, from outside of the widget tree.

This is likely caused by an event handler (like a button’s onPressed) that called
Provider.of without passing `listen: false`.

To fix, write:
Provider.of<Data>(context, listen: false);

It is unsupported because may pointlessly rebuild the widget associated to the
event handler, when the widget tree doesn’t care about the value.

The context used was: Game-[LabeledGlobalKey<GameState>#2ac1a](state: GameState#c5a09)

#0 _AssertionError._doThrowNew (dart:core-patch/errors_patch.dart:46:39)
#1 _AssertionError._throwNew (dart:core-patch/errors_patch.dart:36:5)
#2 Provider.of (package:provider/src/provider.dart:262:7)
#3 GameState.updateScore.<anonymous closure> (package:te<…>

 

■解決

一箇所だけlisten: falseつけ忘れてた。以下に修正したら解決。

Provider.of<Data>(context, listen: false).addScore(combo++);

 

■read, watch,  Provider.of の違い

変更をリッスンしない場合の書き方。以下二つは同じ意味。

final model = context.read<Model>();

final model = Provider.of<Model>(context, listen: false);

 

変更をリッスンする場合の書き方。以下二つは同じ意味。

final model = context.watch<Model>();

final model = Provider.of<Model>(context);

↓参考

Is Provider.of(context, listen: false) equivalent to context.read()?// Are these the same? final model = Provider.of&lt;Model&gt;(context, listen: false); final model = context.read&lt;Model&gt;(); // Are these the same? final model = Provider.of&lt;Model&gt;(co...
Is Provider.of(context, listen: false) equivalent to context.read()? stackoverflow.com
Is Provider.of(context, listen: false) equivalent to context.read()?

 

ここまで読んでいただき、ありがとうございました!

参考になったよ、という方はTwitter(@suekiaoi)やInstagram(@aoi.sueki)などでフォローしていただけると励みになります。

不明点・ご質問などありましたらわたしのTwitter DM(@suekiaoi)にお気軽にどうぞ!

それでは!

末岐 碧衣
  • 末岐 碧衣
  • フリーランス のシステムエンジニア。独立後、一度も営業せずに月収 96 万円を達成。1986年大阪生まれ。早稲田大学理工学部卒。システムエンジニア歴 12年。
    2009年、ITコンサルティング企業に入社。3年目でコミュ障が爆発し人間関係が崩壊。うつにより休職するも、復帰後はコミュ障の自覚を持ち、「チームプレイ」を徹底的に避け、会社組織内においても「一人でできる仕事」に専念。社内外から評価を得た。
    無理に「チームプレイ」するよりも「一人でできる仕事」に専念した方が自分も周囲も幸せにできることを確信し、2015年フリーランスとして独立。