Коли використовувати Provider.of <X> vs. Consumer <X> у Flutter


13

Я до сих пір обгортання мою голову навколо методів державно-управління в тріпотіння , і я трохи заплутався про те, коли і чому використовувати Provider.of<X>VS. 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}');
      },
    ),
  ),
);

Беручи під увагу, де ми потрібні тільки дані про не хочете відновити з UI, ми будемо використовувати 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?

Відповіді:


17

Це не має значення. Але пояснити речі швидко:

Provider.ofє єдиним способом отримання та прослуховування об'єкта. Consumer, Selectorі всі * проксипровідерні дзвінки Provider.ofпрацювати.

Provider.ofvs Consumer- це питання особистої переваги. Але є кілька аргументів для обох

Постачальник

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

Споживач

  • дозволяє відновлювати більш деталізовані віджети
  • вирішує більшість зловживань BuildContext

Це корисно. Я прийму цю відповідь, особливо для інших. Але чи можете ви вказати на посилання на це твердження: "Provider.of - це єдиний спосіб отримання та прослуховування об'єкта. Споживач, селектор та всі * ProxyProvider викликає Provider.of для роботи." Це не те, що я бачив у документах, і це мені дуже допомогло!
Опримус

2
Це лише детальна інформація про те, як працює споживач / ... Ось джерело . Ви бачите, що Consumerв основному нічого, крім Provider.ofнового віджета
Rémi

Чи є ресурси щодо навчання, щоб запобігти зловживанню BuildContext?
吳 強 福
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.