Wann wird Provider.of <X> vs. Consumer <X> in Flutter verwendet?

13

Ich Einwickeln noch meinen Kopf um State-Management - Techniken in Flattern und bin ein wenig verwirrt darüber , wann und warum verwenden Provider.of<X>vs. Consumer<X>. Ich verstehe (glaube ich) aus der Dokumentation, dass Sie bei der Auswahl zwischen diesen beiden Provider.of verwenden würden, wenn wir auf die Daten zugreifen möchten, aber Sie müssen die Benutzeroberfläche nicht ändern. Folgendes (aus den Dokumenten entnommen) erhält Zugriff auf die Daten und aktualisiert die Benutzeroberfläche bei neuen Ereignissen:

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}');
      },
    ),
  ),
);

Während, wo wir nur die Daten benötigen, die nicht mit der Benutzeroberfläche neu erstellt werden sollen, würden wir sie Provider.of<X>mit dem folgenden listenParametersatz verwenden false:

Provider.of<CartModel>(context, listen: false).add(item); \\Widget won't rebuild

Ist listenjedoch nicht erforderlich und wird daher auch Folgendes ausgeführt:

Provider.of<CartModel>(context).add(item); \\listener optional

Das bringt mich zu ein paar Fragen:

  1. Ist dies der richtige Weg, um Provider.of<X>und zu unterscheiden Consumer<X>. Ersteres aktualisiert die Benutzeroberfläche nicht, letzteres nicht?
  2. Wenn listennicht festgelegt, falsewird das Widget standardmäßig neu erstellt oder nicht neu erstellt? Was ist, wenn eingestellt listenist true?
  3. Warum Provider.ofmit der Option, die Benutzeroberfläche überhaupt neu zu erstellen, wenn wir haben Consumer?
Oprimus
quelle

Antworten:

17

Es spielt keine Rolle. Aber um die Dinge schnell zu erklären:

Provider.ofist die einzige Möglichkeit, ein Objekt zu erhalten und anzuhören. Consumer, SelectorUnd alle * ProxyProvider Anrufe Provider.ofan die Arbeit.

Provider.ofvs Consumerist eine Frage der persönlichen Präferenz. Aber es gibt ein paar Argumente für beide

Provider.of

  • kann im gesamten Lebenszyklus von Widgets aufgerufen werden, einschließlich Click-Handler und didChangeDependencies
  • erhöht nicht die Einrückung

Verbraucher

  • Ermöglicht detailliertere Neuerstellungen von Widgets
  • Behebt die meisten BuildContext-Missbräuche
Rémi Rousselet
quelle
Das ist hilfreich. Ich werde diese Antwort akzeptieren, besonders für andere. Können Sie jedoch auf eine Referenz für diese Anweisung verweisen: "Provider.of ist die einzige Möglichkeit, ein Objekt abzurufen und anzuhören. Consumer, Selector und alle * ProxyProvider-Aufrufe von Provider.of funktionieren." Das habe ich in den Dokumenten nicht gesehen und es hat mir wirklich geholfen!
Oprimus
2
Dies ist nur ein Implementierungsdetail der Funktionsweise von Consumer / .... Hier ist die Quelle . Sie können sehen, dass das Consumerim Grunde nichts anderes ist als Provider.ofin einem neuen Widget
Rémi Rousselet
Gibt es Ressourcen zum Lernen, um den Missbrauch von BuildContext zu verhindern?
福 強 福