何时使用ChangeNotifier?

时间:2020-05-30 06:52:15

标签: flutter

flutter sample中,说明了如何使用Provider程序包,其中有两个模型,Catalog和Model。 对于目录模型,不使用ChangeNotifier,但对于购物车模型,则使用它。

Cart model Catalog model

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

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

我的想法正确吗?

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

1 个答案:

答案 0 :(得分:3)

是的,您是正确的。

顾名思义,ChangeNotifier表示通知更改。如您所见,在notifyListners()catalog处调用的函数add用于使用Consumer小部件或Consumer.of()通知已通知给通知者的侦听器。至于什么时候使用ChangeNotifiers呢?每当模型中的状态发生变化时,您就可以使用它,而这些变化取决于树中深处的某些其他视图,而您无法直接进入它们。

enter image description here

因此,从该小部件树中,您可以清楚地看到MyCatalog和MyCart在UI中彼此完全不同,但在逻辑上是相互依赖的。也就是说,每当用户更改MyListItem时,您都需要通知购物车小部件。

此方案的一种可能的解决方案是使用全局变量(某种)或树中MyCatalog和MyCart顶部的变量。这样,当MyCatalog更改状态时,树顶部的ChangeNotifier会知道该更改并通知正在监听更改的MyCart

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

如果我没有记错的话,我们可以不使用提供程序即可实现这一目标。使MyApp成为有状态的窗口小部件,然后将状态传递到MyCatalogMyCart窗口小部件。以便渲染器知道从中获取状态。但是,如果您添加了另一个依赖于树深处状态的小部件,该怎么办?你会把状态传下来吗?还是您会使用提供者?一切都取决于您和您的应用程序。