#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. чтобы рендеры знали, откуда получать состояние. Но что, если вы добавили еще один виджет, который зависит от состояния глубоко в дереве. Вы бы передали состояние вниз? или вы бы использовали провайдера? все зависит от вас и вашего приложения.