Когда использовать Provider.of <X>против Consumer <X>в Flutter - PullRequest
0 голосов
/ 09 ноября 2019

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

1 Ответ

2 голосов
/ 09 ноября 2019

Это не имеет значения. Но для быстрого объяснения:

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

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

Provider.of

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

Потребитель

  • позволяет перестраивать более детализированные виджеты
  • решает большинство случаев неправильного использования BuildContext
...