Я все еще думаю о методах управления состоянием во флаттере и немного озадачен тем, когда и почему использовать Provider.of<X>
против Consumer<X>
. Я понимаю (я думаю) из документации, что при выборе между этими двумя вы будете использовать Provider.of, когда мы хотим получить доступ к данным, но вам не нужно менять пользовательский интерфейс. Таким образом, следующее (взятое из документов) получает доступ к данным и обновляет пользовательский интерфейс при появлении новых событий:
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}');
},
),
),
);
Принимая во внимание, что там, где нам нужны только данные о том, что мы не хотим перестраивать с помощью пользовательского интерфейса, мы будем использовать Provider.of<X>
с listen
параметром, равным false
, как показано ниже:
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>
. Бывший не обновляет интерфейс, последний делает? - Если
listen
не установлено,false
будет ли виджет перестроен по умолчанию или не перестроен? Что еслиlisten
установлено вtrue
? - Почему
Provider.of
с возможностью перестроить пользовательский интерфейс вообще, когда у нас естьConsumer
?
источник
Consumer
это в основном не что иное, какProvider.of
в новом виджете