在flutter sample中,说明了如何使用Provider程序包,其中有两个模型,Catalog和Model。 对于目录模型,不使用ChangeNotifier,但对于购物车模型,则使用它。
为什么ChangeNotifier用于Cart模型而不是Catalog模型?
我的想法是,购物车模型取决于外部(在目录模型中)的更改。 目录模型是硬编码的,因此不需要将任何更改通知任何人。
我的想法正确吗?
PS:这是我的第一个应用程序,在状态管理方面,我是一个完全菜鸟。
答案 0 :(得分:3)
是的,您是正确的。
顾名思义,ChangeNotifier
表示通知更改。如您所见,在notifyListners()
和catalog
处调用的函数add
用于使用Consumer
小部件或Consumer.of()
通知已通知给通知者的侦听器。至于什么时候使用ChangeNotifiers
呢?每当模型中的状态发生变化时,您就可以使用它,而这些变化取决于树中深处的某些其他视图,而您无法直接进入它们。
因此,从该小部件树中,您可以清楚地看到MyCatalog和MyCart在UI中彼此完全不同,但在逻辑上是相互依赖的。也就是说,每当用户更改MyListItem
时,您都需要通知购物车小部件。
此方案的一种可能的解决方案是使用全局变量(某种)或树中MyCatalog和MyCart顶部的变量。这样,当MyCatalog更改状态时,树顶部的ChangeNotifier
会知道该更改并通知正在监听更改的MyCart
。
ChangeNotifiers
用于这种情况,如文档所述here,我们需要提升状态,或者当您需要树中无法直接给出的深层值时,可以使用它。 In case of react we call it props drilling
。将状态赋予树中的子窗口小部件。
如果我没有记错的话,我们可以不使用提供程序即可实现这一目标。使MyApp
成为有状态的窗口小部件,然后将状态传递到MyCatalog
和MyCart
窗口小部件。以便渲染器知道从中获取状态。但是,如果您添加了另一个依赖于树深处状态的小部件,该怎么办?你会把状态传下来吗?还是您会使用提供者?一切都取决于您和您的应用程序。