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 listen
ustawionym parametrem false
, jak poniżej:
Provider.of<CartModel>(context, listen: false).add(item); \\Widget won't rebuild
Nie listen
jest 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ń:
- Czy to właściwy sposób na rozróżnienie
Provider.of<X>
iConsumer<X>
. Dawniej nie aktualizuje interfejsu użytkownika, a później robi? - Jeśli
listen
nie jest ustawiony, tofalse
czy widget zostanie odbudowany domyślnie czy nie? Co jeślilisten
jest ustawiony natrue
? - Dlaczego
Provider.of
w ogóle mamy opcję przebudowania interfejsu użytkownikaConsumer
?
źródło
Consumer
to w zasadzie nic innego, jak tylkoProvider.of
w nowym widżecie