我对Flutter Provider模式有疑问。将用户重定向到新屏幕后,找不到提供程序。
按照我的上一个问题(Could not find the correct provider above this widget) 我写了这段代码:
class NewRoute extends StatelessWidget {
@override
Widget build(BuildContext context) {
final title = 'Tap to select';
return MaterialApp(
title: title,
home: Scaffold(
appBar: AppBar(
title: Text(title),
),
body: NewRouteBody()
));
}
}
class NewRouteBody extends StatelessWidget {
@override
Widget build(BuildContext context) {
var user = Provider.of<UserRepository>(context);
return ListView(...)
我做过同样的事情,但再次收到错误消息,提示它在此小部件(NewRouteBody
)上方找不到正确的提供程序。
试图以某种方式解决它,谷歌搜索了几个小时,但没有成功...
感谢您的帮助。
编辑
这是UserRepository
,其中包含模式:
class UserRepository with ChangeNotifier {
User user;
Status _status = Status.Uninitialized;
Status get status => _status;
User get getUser => user;
...}
编辑2:
带有ChangeNotifier的代码段:
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData(
primarySwatch: Colors.red,
),
home: HomePage(),
);
}
}
class HomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider<UserRepository>(
builder: (context) => UserRepository.instance(),
child: Consumer<UserRepository>(
builder: (context, UserRepository userRepository, _) {
switch (userRepository.status) {
case Status.Uninitialized:
return Login();
case Status.Unauthenticated:
return Login();
case Status.Authenticating:
case Status.Authenticated:
if(userRepository.getUser.isPrefSet == 0){
return Selection();
}
return Dashboard();
}
},
),
);
}
}
答案 0 :(得分:0)
您首先需要创建Provider并将其放置在用法上方的树中。 例如,在您的情况下:
Widget build(BuildContext context) {
final title = 'Tap to select';
return MaterialApp(
title: title,
home: Scaffold(
appBar: AppBar(
title: Text(title),
),
body: Provider<UserRepository> (
builder: (context) => UserRepository(),
dispose: (context, val) => val.dispose(),
child: NewRouteBody())
));
}
答案 1 :(得分:0)
问题是:
您的ChangeNotifierProvider
位于 Home 内部,但是您尝试在外部 Home 中访问它。
提供程序是作用域的。这意味着,如果它位于小部件树中,则只有其后代才能访问它。因此,在您的代码中,只有 Home 可以从提供程序读取。
要解决此问题,请将提供程序移至 MaterialApp 上方:
ChangeNotifierProvider<UserRepository> (
builder: (context) => UserRepository(),
child: MaterialApp(
home: Home(),
),
)