导航到另一条路线后如何使用 Provider?
Posted
技术标签:
【中文标题】导航到另一条路线后如何使用 Provider?【英文标题】:How to consume Provider after navigating to another route? 【发布时间】:2020-01-14 18:07:17 【问题描述】:我的应用有 2 种用户类型:管理员和普通用户。我向管理员显示管理屏幕,向普通用户显示普通屏幕。所有用户都需要访问Provider
model1
。但只有管理员需要访问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
。但这只是我访问它的页面的范围。 model2
在Navigator.push()
之后将不可用于其他导航路线。可以举个例子吗?
将推送的子代包裹到ChangeNotifierProxyProvider
,这样你就可以复制现有model2的状态
谢谢!!我试过了,但我不明白该怎么做。我仍然得到错误找不到正确的提供者。你的意思是这样的:Navigator.push(model2)
。可以给代码吗?
@FlutterFirebase 我已经更改了答案,因为 ProxyProvider 无法解决您的问题
有没有办法通过命名推送方法暴露模型?以上是关于导航到另一条路线后如何使用 Provider?的主要内容,如果未能解决你的问题,请参考以下文章
在我的 laravel 4 和 angularjs 应用程序中从一条路线重定向到另一条路线