我有一个典型的 CRUD 操作任务:(列出站点、添加站点、...)
我创建了一个 SitesProvider
。在同一个提供程序中,我添加了 2 种添加和编辑方法。我想在 2 个屏幕(ListSites
和 AddEditSite
)
在 ListSites
屏幕中,它工作正常。问题来了:
AddSite
打开 AddButton
屏幕ListSites
屏幕中,而不是 AddSite
屏幕中。这是有道理的。它们都使用相同的提供程序,两个屏幕都在堆栈上。似乎第一个只消耗状态更新并显示错误。
我使用 MultipleProviders
方法将 MaterialApp 与应用中的所有提供程序一起包装。
我们能否在不为 2 个屏幕中的每一个创建单独的提供程序的情况下解决这个问题?
编辑:
我在打开 AddEdit 之前在 provider.removeListener
屏幕中使用了 ListSites
,现在它在正确的屏幕中显示错误。我仍然需要做一些其他的调整才能在我添加后让它重新收听。我认为效率不高,但这是一个步骤。
答案 0 :(得分:0)
我最终做到了:
在提供者中添加了另一个字段(stateType:list/ addedit)
根据我当前所在的屏幕更改类型
provider.stateType = UIStateType.add_edit;
await Navigator.push(context, MaterialPageRoute(builder: (context) => AddEditSiteScreen()));
provider.stateType = UIStateType.list;
在 build() 中,我检查类型
sitesProvider = Provider.of(context);
if (sitesProvider.stateType != UIStateType.add_edit) return Container();