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