【问题标题】:How to make Provider and Navigator work together?如何让Provider和Navigator协同工作?
【发布时间】:2020-01-13 17:09:50
【问题描述】:

我使用Provider 进行状态管理以及将业务逻辑与 UI 分开。

我在MaterialApp 上方放置了一些Provider,以便可以访问应用程序中的任何位置(例如用户信息)。

但是 You don’t want to place ChangeNotifierProvider higher than necessary (because you don’t want to pollute the scope).

所以我尝试放置一些Provider,它们仅在小部件树中较低的某些页面上使用。

例如,在我的购买项目流程中,我可以拥有:SelectItemPage => ConfirmItemPage => CheckOutPage

但我的问题是Navigator.push() 每次都创建单独的小部件树。因此,如果我在 SelectItemPage 中初始化 Provider,则无法在 ConfirmItemPageCheckOutPage 中访问。

我希望 Provider 成为此流程的范围,但我不知道如何。

我该如何解决这个问题? 还是我的方法不对?

编辑:我知道我可以使用道具钻孔来传递来自SelectItemPage => ConfirmItemPage => CheckOutPage 的数据,但这很难维护。我想使用Provider 而不是支柱钻孔。

【问题讨论】:

  • 有帮助吗:dev.to/shakib609/…?每个选项卡都根据用户操作获取列表。状态管理和导航也不应该相互影响。
  • @skjagini 感谢您的回复!但你的文章是没有帮助的。它只是在小部件树的顶部初始化 Provider。即使在导航之后,我也希望初始化更低并访问更低。
  • 如果您需要跨页面,则需要根级别。如果您不喜欢代码的组织方式,可以查看 Redux 实现,但同样没有其他选择。

标签: flutter dart flutter-provider


【解决方案1】:

我觉得没办法,你必须在每个类上初始化provider

尝试在你的应用上这样使用

在你的主应用上

MultiProvider(
      providers: ChangeNotifierProvider<yourstate>(
          builder: (context) => yourstate,
        ),
child: MaterialApp...

在每个页面上,您可以使用以下代码进行初始化

final state = Provider.of<yourstate>(context);

如果你不想监听状态的任何变化,就这样使用

final state = Provider.of<yourstate>(context, listen: false);

【讨论】:

  • 感谢您的回复!但这不是污染范围吗?
猜你喜欢
  • 2020-01-17
  • 2017-11-15
  • 2014-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多