Когда использовать Provider.of <X> против Consumer <X> в Flutter

13

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

Итак, это подводит меня к нескольким вопросам:

  1. Это правильный способ отличить Provider.of<X>и Consumer<X>. Бывший не обновляет интерфейс, последний делает?
  2. Если listenне установлено, falseбудет ли виджет перестроен по умолчанию или не перестроен? Что если listenустановлено в true?
  3. Почему Provider.ofс возможностью перестроить пользовательский интерфейс вообще, когда у нас есть Consumer?
Oprimus
источник

Ответы:

17

Это не важно Но чтобы объяснить вещи быстро:

Provider.ofэто единственный способ получить и прослушать объект. Consumer, SelectorИ все * ProxyProvider вызовы Provider.ofк работе.

Provider.ofпротив Consumerэто вопрос личных предпочтений. Но есть несколько аргументов для обоих

Provider.of

  • может вызываться во всех жизненных циклах виджетов, включая обработчики кликов и didChangeDependencies
  • не увеличивает отступ

потребитель

  • позволяет перестраивать более гранулированные виджеты
  • решает большинство злоупотреблений BuildContext
Реми Русселе
источник
Это полезно Я собираюсь принять этот ответ, особенно для других. Но можете ли вы указать ссылку на это утверждение: «Provider.of - это единственный способ получить и прослушать объект. Потребитель, Selector и все * ProxyProvider вызывают Provider.of для работы». Это не то, что я видел в документах, и это действительно помогло мне!
Опримус
2
Это просто деталь реализации того, как работает Consumer / .... Вот источник . Вы можете видеть, что Consumerэто в основном не что иное, как Provider.ofв новом виджете
Rémi Rousselet
Есть ли какие-либо ресурсы об обучении, чтобы предотвратить злоупотребление BuildContext?
福 強 福