何时使用 ChangeNotifier?

MAA*_*MAA 2 flutter

在解释如何使用Provider包的flutter示例中,有两个模型,Catalog和Model。对于 Catalog 模型,不使用 ChangeNotifier,但对于 Cart 模型则使用它。

推车型号 目录型号

为什么 ChangeNotifier 用于 Cart 模型而不是 Catalog 模型?

我的想法是,购物车模型取决于外部(目录模型中)的变化。目录模型是硬编码的,因此无需通知任何人更改。

我的想法正确吗?

PS:这是我的第一个应用程序,在状态管理方面我完全是个菜鸟。

小智 6

是的,你是对的。

顾名思义ChangeNotifier,代表通知更改。正如您所看到的,调用的函数notifyListners()atcatalogadd函数用于通知使用Consumerwidget 或使用订阅通知程序的侦听器Consumer.of()。那么什么时候使用ChangeNotifiers呢?每当模型中存在依赖于树深处的其他视图(您无法直接访问它们)的状态更改时,您就可以使用 then 。

在此输入图像描述

所以从这个小部件树中你可以清楚地看到MyCatalog和MyCart在UI上完全不同,但在逻辑上是依赖的。即,每当用户更改 时,您都需要通知购物车小部件MyListItem

对于这种情况,一种可能的解决方案是使用全局变量(某种程度)或位于树中 MyCatalog 和 MyCart 顶部的变量。这样,当 MyCatalog 更改状态时,ChangeNotifier树顶部就会知道更改并通知MyCart正在侦听更改的人员。

ChangeNotifiers用于这种情况,我们需要按照文档所述提升状态,或者当您需要树深处无法直接给出的值时,您可以使用它。In case of react we call it props drilling。将状态赋予树中的子部件。

如果我没记错的话,我们可以在不使用提供商的情况下实现这一目标。制作MyApp一个有状态的小部件并将状态传递给MyCatalogMyCart部件。以便渲染器知道从中获取状态。但是,如果您添加另一个依赖于树深处状态的小部件会怎么样。你会把国家传下去吗?或者您会使用提供商吗?一切都取决于您和您的申请。