Kiedy używać Provider.of <X> vs. Consumer <X> w Flutter

13

Ja nadal zawijania moja głowa wokół stan techniki zarządzania w trzepotanie i jestem nieco mylić o tym, kiedy i dlaczego używać Provider.of<X>Vs. Consumer<X>. Rozumiem (myślę) z dokumentacji, że wybierając między tymi dwoma, użyłbyś Provider.of, kiedy chcemy dostępu do danych, ale nie potrzebujesz interfejsu użytkownika do zmiany. Tak więc następujące elementy (zaczerpnięte z dokumentów) uzyskują dostęp do danych i aktualizują interfejs użytkownika w przypadku nowych zdarzeń:

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

Podczas gdy tam, gdzie potrzebujemy tylko danych, nie chcemy odbudowywać z interfejsem użytkownika, użylibyśmy Provider.of<X>z listenustawionym parametrem false, jak poniżej:

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

Nie listenjest to jednak wymagane, więc uruchomione zostaną również następujące elementy:

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

To prowadzi mnie do kilku pytań:

  1. Czy to właściwy sposób na rozróżnienie Provider.of<X>i Consumer<X>. Dawniej nie aktualizuje interfejsu użytkownika, a później robi?
  2. Jeśli listennie jest ustawiony, to falseczy widget zostanie odbudowany domyślnie czy nie? Co jeśli listenjest ustawiony na true?
  3. Dlaczego Provider.ofw ogóle mamy opcję przebudowania interfejsu użytkownika Consumer?
Oprimus
źródło

Odpowiedzi:

17

To nie ma znaczenia Ale aby wyjaśnić wszystko szybko:

Provider.ofto jedyny sposób na uzyskanie i odsłuchanie obiektu. Consumer, Selectori wszystkie wywołania * ProxyProvider Provider.ofdo pracy.

Provider.ofvs Consumerjest kwestią osobistych preferencji. Ale jest kilka argumentów na jedno i drugie

Provider.of

  • można wywoływać we wszystkich cyklach życia widżetów, w tym w modułach obsługi kliknięć i didChangeDependencies
  • nie zwiększa wcięcia

Konsument

  • pozwala na bardziej szczegółowe przebudowywanie widgetów
  • rozwiązuje większość przypadków niewłaściwego użycia BuildContext
Rémi Rousselet
źródło
To jest pomocne. Przyjmuję tę odpowiedź, szczególnie dla innych. Ale czy możesz wskazać odniesienie do tej instrukcji: „Provider.of to jedyny sposób na uzyskanie i odsłuchanie obiektu. Consumer, Selector i wszystkie * ProxyProvider wywołują Provider.of do pracy”. To nie jest coś, co widziałem w dokumentach i to naprawdę mi pomogło!
Oprimus
2
Jest to tylko szczegół implementacyjny dotyczący działania aplikacji Consumer / ... Oto źródło . Widać, że Consumerto w zasadzie nic innego, jak tylko Provider.ofw nowym widżecie
Rémi Rousselet
Czy są jakieś zasoby na temat uczenia się, jak zapobiegać niewłaściwemu użyciu BuildContext?
吳 強 福