Я все еще думаю о методах управления состоянием во флаттере и немного озадачен тем, когда и почему использовать 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?