Когда использовать ChangeNotifier?

#flutter

#flutter

Вопрос:

В примере flutter, объясняющем, как использовать пакет поставщика, есть две модели: Catalog и Model . Для модели каталога ChangeNotifier не используется, но для модели корзины он используется.

Модель корзины
Модель каталога

Почему ChangeNotifier используется для модели корзины, а не для модели каталога?

Я думаю, что модель корзины зависит от изменений снаружи (в модели каталога). Модель каталога жестко запрограммирована и, следовательно, нет необходимости уведомлять кого-либо об изменениях.

Правильно ли я думаю?

PS: это мое первое приложение, и я полный новичок, когда дело доходит до управления состоянием.

Ответ №1:

Да, вы правы.

ChangeNotifier Как следует из названия, означает уведомление об изменениях. Как вы можете видеть, функция notifyListners() , вызываемая at catalog , и add функции используются для уведомления слушателей, подписавшихся на уведомитель, с помощью Consumer виджета или с помощью Consumer.of() . Итак, когда использовать ChangeNotifiers ? Вы можете использовать then всякий раз, когда в модели происходят изменения состояния, зависящие от какого-либо другого представления в глубине дерева, к которому вы не можете получить доступ напрямую.

введите описание изображения здесь

Итак, из этого дерева виджетов вы можете ясно видеть, что MyCatalog и MyCart полностью отличаются друг от друга в пользовательском интерфейсе, но логически зависят друг от друга. т. Е. Вам нужно уведомлять виджет корзины всякий раз, когда пользователь изменяет MyListItem .

Одним из возможных решений для этого сценария является использование глобальных переменных (вроде) или переменной, которая находится в верхней части MyCatalog и MyCart в дереве. Так что, когда MyCatalog изменяет состояние ChangeNotifier , в верхней части дерева будет знать об изменении и уведомлять MyCart о том, что прослушивает изменения.

ChangeNotifiers используются в таком сценарии, когда нам нужно поднять состояние, как указано в документации здесь, или вы можете использовать его, когда вам нужны значения глубоко в дереве, которые вы не можете предоставить напрямую. In case of react we call it props drilling . Предоставление состояния дочерним виджетам в дереве.

Мы могли бы достичь этого без использования провайдеров, если я не ошибаюсь. Создание MyApp виджета с полным состоянием и передача состояния MyCatalog MyCart виджету and. чтобы рендеры знали, откуда получать состояние. Но что, если вы добавили еще один виджет, который зависит от состояния глубоко в дереве. Вы бы передали состояние вниз? или вы бы использовали провайдера? все зависит от вас и вашего приложения.