导航到新屏幕时无法访问提供程序
Provider not accesable when Navigate to new screen
有一个问题我已经坐了几天了。
有一个应用程序,其中:
根据 AUTH 状态,显示 'LoginScreen' 或 'MainScreen'。
在 MainScreen 中,我使用屏幕(HomeScreen、ShoppingScreen、MyFavorites)设置 bottomNavigation
- 我也通过使用 MultiProvider
在那里设置了我的 StreamProviders(那些依赖于 Auth)
- 在主屏幕上,当我使用 Provider.of(context) 时,它会正常工作
但是当我使用时:
`Navigator.push(
context,
MaterialPageRoute(
builder: (_) => ProfileScreen(),
),
);
` 并使用 Provider.of(context) 我得到“找不到正确的提供者....在此之上...小部件”
我阅读了一些关于此的问题,解决方案是在 MaterailApp 之上 decler providers,在我的情况下我不能这样做,因为我只能在 Auth 成功后设置 thoese。
尝试将上下文(从 HomeScreen)传递到 ProfileScreen(通过构造函数)并且成功了,但是当 UserData 的值发生变化时,它没有更新屏幕(猜测是因为不同 'contexts')
我在这里做错了什么,有什么想法吗?:S
请确保您的应用程序的根小部件是 Provider
小部件,它应该是 MaterialWidget
的父级。如果已经是这种情况,我将需要您的代码进行调查。像这样
class AppState {
User loggedInUser;
bool get isLoggedIn {
return loggedInUser != null;
}
// Other states as per the requirements
// ...
}
提供商是 "scoped"。
这意味着如果将它们放置在屏幕内,则无法在该屏幕外访问它们。
这意味着如果一个提供者在范围内但需要在创建它的路由之外访问,我们有两个解决方案:
取消提供商的范围。这涉及将提供程序移动到需要获取值的两个小部件的共同祖先。
如果这两个小部件在两个不同的路由上,那么它基本上意味着“将提供商移到 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(),
),
),
);
有一个问题我已经坐了几天了。 有一个应用程序,其中:
根据 AUTH 状态,显示 'LoginScreen' 或 'MainScreen'。
在 MainScreen 中,我使用屏幕(HomeScreen、ShoppingScreen、MyFavorites)设置 bottomNavigation
- 我也通过使用 MultiProvider 在那里设置了我的 StreamProviders(那些依赖于 Auth)
- 在主屏幕上,当我使用 Provider.of(context) 时,它会正常工作
但是当我使用时:
`Navigator.push( context, MaterialPageRoute( builder: (_) => ProfileScreen(), ), );
` 并使用 Provider.of(context) 我得到“找不到正确的提供者....在此之上...小部件”
我阅读了一些关于此的问题,解决方案是在 MaterailApp 之上 decler providers,在我的情况下我不能这样做,因为我只能在 Auth 成功后设置 thoese。
尝试将上下文(从 HomeScreen)传递到 ProfileScreen(通过构造函数)并且成功了,但是当 UserData 的值发生变化时,它没有更新屏幕(猜测是因为不同 'contexts')
我在这里做错了什么,有什么想法吗?:S
请确保您的应用程序的根小部件是 Provider
小部件,它应该是 MaterialWidget
的父级。如果已经是这种情况,我将需要您的代码进行调查。像这样
class AppState {
User loggedInUser;
bool get isLoggedIn {
return loggedInUser != null;
}
// Other states as per the requirements
// ...
}
提供商是 "scoped"。
这意味着如果将它们放置在屏幕内,则无法在该屏幕外访问它们。
这意味着如果一个提供者在范围内但需要在创建它的路由之外访问,我们有两个解决方案:
取消提供商的范围。这涉及将提供程序移动到需要获取值的两个小部件的共同祖先。
如果这两个小部件在两个不同的路由上,那么它基本上意味着“将提供商移到
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(), ), ), );