web-dev-qa-db-ja.com

FlutterでProvider.of <X>とConsumer.Xを使用する場合

私はまだ状態管理手法に頭を抱えており、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

だから、これは私にいくつかの質問をもたらします:

  1. これは、Provider.of<X>Consumer<X>を区別する正しい方法ですか?元はUIを更新しませんが、後者は更新しますか?
  2. listenfalseに設定されていない場合、ウィジェットはデフォルトで再構築されますか、それとも再構築されませんか? listentrueに設定されている場合はどうなりますか?
  3. Consumerがあるのに、UIを再構築するオプションを備えたProvider.ofがあるのはなぜですか?
9
Oprimus

それは問題ではありません。しかし、物事を迅速に説明するには:

Provider.ofonlyオブジェクトを取得してリッスンする方法です。 ConsumerSelector、およびすべての* ProxyProvider呼び出しProvider.of動作します。

Provider.of vs Consumerは個人の好みの問題です。しかし、両方についていくつかの議論があります

Provider.of

  • クリックハンドラーとdidChangeDependenciesを含むすべてのウィジェットライフサイクルで呼び出すことができます。
  • インデントを増やしません

消費者

  • より細かいウィジェットの再構築を可能にする
  • ほとんどのBuildContextの誤用を解決します
11
Rémi Rousselet