在此小部件上方找不到正确的提供者
问题内容:
我在使用Flutter
Provider时遇到问题…我的流程是这样的:将登录用户ID传递到新的小部件后->从那里将其预先保存到db,然后将其重定向到新的小部件(仪表板)。
这是登录后的小部件代码:
return MaterialApp(
title: title,
home: Scaffold(
appBar: AppBar(
title: Text(title),
),
body: ListView(
children: <Widget>[
Container(
margin: EdgeInsets.all(8.0),
child: Card(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(8.0))),
child: InkWell(
onTap: () {
var user = Provider.of<UserRepository>(context);
user.savePreference(user.user.id, "Something");
user.navigateToNewPage(Dashboard(), context);
print(user.user.id);
},
这有效:
user.savePreference(user.user.id, "Something");
但这引起了一个问题:
user.navigateToNewPage(Dashboard(), context);
在仪表板小部件中,我正在创建以下代码:
Widget build(BuildContext context) {
var user = Provider.of<UserRepository>(context);
在UserRepository中,我有这个:
class UserRepository with ChangeNotifier {
User user;
Status _status = Status.Uninitialized;
Status get status => _status;
User get getUser => user;
UserRepository.instance();
Future<void> navigateToNewPage(Widget page, BuildContext context) {
Navigator.push(context, MaterialPageRoute(builder: (context) => page));
}
我知道这个话题已经解决了问题,但是找不到适合我问题的东西。
问题答案:
尝试将脚手架下方的小部件树的一部分提取到单独的小部件中。您现在使用的上下文用于构建尚未导航的顶级窗口小部件。
产生的代码应如下所示:
return MaterialApp(
title: title,
home: Scaffold(
appBar: AppBar(
title: Text(title),
),
body: LoginWidget()
class LoginWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ListView(
children: <Widget>[
Container(
margin: EdgeInsets.all(8.0),
child: Card(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(8.0))),
child: InkWell(
onTap: () {
var user = Provider.of<UserRepository>(context);
user.savePreference(user.user.id, "Something");
user.navigateToNewPage(Dashboard(), context);
print(user.user.id);
},
...
}
}