导航到另一条路线后如何使用 Provider?

Posted

技术标签:

【中文标题】导航到另一条路线后如何使用 Provider?【英文标题】:How to consume Provider after navigating to another route? 【发布时间】:2020-01-14 18:07:17 【问题描述】:

我的应用有 2 种用户类型:管理员和普通用户。我向管理员显示管理屏幕,向普通用户显示普通屏幕。所有用户都需要访问Providermodel1。但只有管理员需要访问model2

我怎样才能只为管理员用户初始化model2

例如:

class MyApp extends StatelessWidget 
  final model1 = Model1();

  final model2 = Model2();

  @override
  Widget build(BuildContext context) 

return MultiProvider(
    providers: [
ChangeNotifierProvider(builder: (_) => model1),
      ChangeNotifierProvider(builder: (_) => model2),
    ],
    child: MaterialApp(

我只想将model2 放入AdminScreen。但如果我这样做,其他管理页面将无法在Navigator.push 之后访问model2,因为它们不是AdminScreen 的后代。

感谢您的帮助!

【问题讨论】:

【参考方案1】:

您可以将现有模型向前传递,使用现有模型的值创建一个新的ChangeNotifierProvider

为此,您需要使用 ChangeNotifierProvider.value 构造函数传递现有的 model2 作为值。

如果你已经有一个 ChangeNotifier 的实例并且想要公开它,你应该使用 ChangeNotifierProvider.value 而不是默认的构造函数。

MaterialPageRoute(
  builder: (context) => ChangeNotifierProvider<Model2>.value(
    value: model2,
    child: SecondRoute(),
  ),
);

【讨论】:

感谢您的回复!你对ChangeNotifierProxyProvider 是正确的,我可以访问model1。但这只是我访问它的页面的范围。 model2Navigator.push() 之后将不可用于其他导航路线。可以举个例子吗? 将推送的子代包裹到ChangeNotifierProxyProvider,这样你就可以复制现有model2的状态 谢谢!!我试过了,但我不明白该怎么做。我仍然得到错误找不到正确的提供者。你的意思是这样的:Navigator.push(model2)。可以给代码吗? @FlutterFirebase 我已经更改了答案,因为 ProxyProvider 无法解决您的问题 有没有办法通过命名推送方法暴露模型?

以上是关于导航到另一条路线后如何使用 Provider?的主要内容,如果未能解决你的问题,请参考以下文章

导航到另一条路线后,Can Angccate可以继续吗?

如何以角度将数据从一条路线传输到另一条路线? [复制]

如何将状态从一个反应路线传递到另一个反应路线?

在我的 laravel 4 和 angularjs 应用程序中从一条路线重定向到另一条路线

从 TabBarView Child 导航到另一个 Route(全屏)

如何解决vue中避免冗余导航到当前位置错误?