私はまだ状態管理手法に頭を抱えており、Provider.of<X>
とConsumer<X>
をいつどのように使用するかについて少し混乱しています。 documentation から(私は)私が理解していることは、これらの2つを選択するときに、データへのアクセスが必要なときにProvider.ofを使用することですが、UIを変更する必要はありません。したがって、次の(ドキュメントから取得)はデータにアクセスし、新しいイベントでUIを更新します。
return HumongousWidget(
// ...
child: AnotherMonstrousWidget(// <- This widget will rebuild on new data events
// ...
child: Consumer<CartModel>(
builder: (context, cart, child) {
return Text('Total price: ${cart.totalPrice}');
},
),
),
);
一方、データだけが必要な場合は、UIで再構築したくない場合は、listen
パラメータをfalse
に設定してProvider.of<X>
を使用します。
Provider.of<CartModel>(context, listen: false).add(item); \\Widget won't rebuild
ただし、listen
は必須ではないため、以下も実行されます。
Provider.of<CartModel>(context).add(item); \\listener optional
だから、これは私にいくつかの質問をもたらします:
Provider.of<X>
とConsumer<X>
を区別する正しい方法ですか?元はUIを更新しませんが、後者は更新しますか?listen
がfalse
に設定されていない場合、ウィジェットはデフォルトで再構築されますか、それとも再構築されませんか? listen
がtrue
に設定されている場合はどうなりますか?Consumer
があるのに、UIを再構築するオプションを備えたProvider.of
があるのはなぜですか?それは問題ではありません。しかし、物事を迅速に説明するには:
Provider.of
はonlyオブジェクトを取得してリッスンする方法です。 Consumer
、Selector
、およびすべての* ProxyProvider呼び出しProvider.of
動作します。
Provider.of
vs Consumer
は個人の好みの問題です。しかし、両方についていくつかの議論があります
didChangeDependencies
を含むすべてのウィジェットライフサイクルで呼び出すことができます。