Когда использовать ChangeNotifier? - PullRequest
0 голосов
/ 30 мая 2020

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

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

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

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

Я правильно думаю?

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

1 Ответ

3 голосов
/ 30 мая 2020

Да, вы правы.

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

enter image description here

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

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

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

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

...