Flutter:使用在多个屏幕中使用的提供程序更新特定屏幕

时间:2021-07-01 07:20:23

标签: flutter flutter-provider

我有一个典型的 CRUD 操作任务:(列出站点、添加站点、...)

我创建了一个 SitesProvider。在同一个提供程序中,我添加了 2 种添加和编辑方法。我想在 2 个屏幕(ListSitesAddEditSite

中使用相同的提供程序

ListSites 屏幕中,它工作正常。问题来了:

  • 我通过点击 ListSites 屏幕中的 AddSite 打开 AddButton 屏幕
  • 点击提交(没有输入数据,模拟错误情况)
  • 错误显示在 ListSites 屏幕中,而不是 AddSite 屏幕中。

这是有道理的。它们都使用相同的提供程序,两个屏幕都在堆栈上。似乎第一个只消耗状态更新并显示错误。

我使用 MultipleProviders 方法将 MaterialApp 与应用中的所有提供程序一起包装。

我们能否在不为 2 个屏幕中的每一个创建单独的提供程序的情况下解决这个问题?

编辑:

我在打开 AddEdit 之前在 provider.removeListener 屏幕中使用了 ListSites,现在它在正确的屏幕中显示错误。我仍然需要做一些其他的调整才能在我添加后让它重新收听。我认为效率不高,但这是一个步骤。

1 个答案:

答案 0 :(得分:0)

我最终做到了:

  1. 在提供者中添加了另一个字段(stateType:list/ addedit)

  2. 根据我当前所在的屏幕更改类型

    provider.stateType = UIStateType.add_edit;

await Navigator.push(context, MaterialPageRoute(builder: (context) => AddEditSiteScreen()));

provider.stateType = UIStateType.list;

  1. 在 build() 中,我检查类型

    sitesProvider = Provider.of(context);

    if (sitesProvider.stateType != UIStateType.add_edit) return Container();