有一个问题,我现在坐了几天。 有一个应用程序,其中:
取决于AUTH状态,显示“ LoginScreen”或“ MainScreen”。
在主屏幕中,我设置了带有屏幕(HomeScreen,ShoppingScreen,MyFavorites)的底部导航
但是当我使用时:
`Navigator.push(
context,
MaterialPageRoute(
builder: (_) => ProfileScreen(),
),
);
`并在此处使用Provider.of(上下文),我得到“ 找不到正确的Provider。...在此之上...小部件”
我读到了一些问题,解决了MaterailApp上方的拒绝提供程序的问题,在我的情况下,我做不到,因为只有在Auth成功后才能设置语言。
尝试将上下文(从HomeScreen)传递到ProfileScreen(通过构造函数),并且可以正常工作,但是当UserData的值更改时,它不会更新屏幕(猜测是由于“上下文”不同)。
在这里,我有什么想法吗?:S
答案 0 :(得分:1)
请确保您应用程序的根窗口小部件是MaterialWidget
窗口小部件,它应是class AppState {
User loggedInUser;
bool get isLoggedIn {
return loggedInUser != null;
}
// Other states as per the requirements
// ...
}
的父级。如果已经是这种情况,我将需要您的代码进行研究。像这样
DeviceEventEmitter
答案 1 :(得分:1)
提供商是“范围”的。
这意味着,如果将它们放置在屏幕内,则无法在屏幕外访问它们。
这意味着,如果提供程序是作用域的,但需要在创建它的路径之外进行访问,我们有两种解决方案:
取消提供程序的作用域。这涉及将提供者移动到需要获取值的两个小部件的共同祖先。
如果这两个小部件位于两条不同的路线上,则基本上意味着“将提供者移至MaterialApp
/ CupertinoApp
上方。
手动将提供程序传递到新屏幕(使用Navigator.push
时需要)
我们的想法是,我们有两个 ,而不是一个一个提供程序,它们都使用与此处所述相同的值。有关实际操作,请参见How to scope a ChangeNotifier to some routes using Provider?例子。
对于Navigator.push
,它看起来像:
final myModel = Provider.of<MyModel>(context);
Navigator.push(
context,
MaterialPageRoute(
builder: (_) =>
ChangeNotifierProvider.value(
value: myModel,
child: MyScreen(),
),
),
);