如何解决一个小部件中的两个提供程序-Flutter
我有这个问题。在我的应用程序中,我使用Provider package
来管理登录状态。在MaterialApp中,我还想管理某种用户配置,在本例中是主题选择。
如果我尝试使用两次Provider.of<LoginService>(context)
,则会收到此错误:
Could not find the correct Provider<LoginService> above this MyApp Widget
This likely happens because you used a `BuildContext` that does not include the provider
of your choice.
如何一次在Provider中使用Provider.of...
甚至在小部件中甚至两个不同的Provider中使用(例如,将我的LoginService
和我的UserconfigService
分开)?
谢谢!
实际代码:
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider<LoginService>(
create: (context) => LoginService(),child: MaterialApp(
title: 'My App',debugShowCheckedModeBanner: false,theme: ThemeData.dark(),routes: {
'/': (BuildContext context) {
var state = Provider.of<LoginService>(context);
if (state.isLoggedIn()) {
return HomeScreen();
} else {
return LoginScreen();
}
},MentorScreen.id: (BuildContext context) => MentorScreen(),},)
);
}
我的目标:
child: MaterialApp(
title: 'MyApp',theme: state.isDarkThemeEnabled() == true ? ThemeData.dark() : ThemeData.light(),...
解决方法
您可以使用MultiProvider代替ChangeNotifierProvider。 在here中了解更多信息。
,在创建context
类之后立即使用ChangeNotifierProvider
时,会出现这种类型的错误。
类似地,如果您使用context
中的Scaffold
来showDialog,则会出现类似的错误。
Here is the answer that explains why this happens
对于此Wrap,您的MaterialApp
类中的Builder
小部件将首先等待该类生成,然后调用Provider.of<T>(context)
方法。
Builder(
builder: (context) {
return MaterialApp(
title: 'My App',debugShowCheckedModeBanner: false,theme: ThemeData.dark(),routes: {
'/': (BuildContext context) {
var state = Provider.of<LoginService>(context);
if (state.isLoggedIn()) {
return HomeScreen();
} else {
return LoginScreen();
}
},MentorScreen.id: (BuildContext context) => MentorScreen(),},);
},),
,以及同一窗口小部件中的两个提供程序。
使用MultiProvider
。
这是我的一个应用程序中的代码。
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Provider(
create: (_) => locator<FAuthService>(),builder: (context,_) {
return MultiProvider(
child: MaterialApp(
onGenerateRoute: Router.onGenerateRoute,initialRoute: initialRoute,navigatorKey: locator<NavigationService>().globalKey,title: 'Demo',theme: ThemeData(
primaryColor: Colors.black,providers: [
ChangeNotifierProvider<HomeVM>(
create: (_) => locator<HomeVM>(),ChangeNotifierProvider<LoginVM>(
create: (context) => locator<LoginVM>(),],);
});
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。