一尘不染

在此小部件上方找不到正确的提供者

flutter

我在使用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));
  }

我知道这个话题已经解决了问题,但是找不到适合我问题的东西。


阅读 243

收藏
2020-08-13

共1个答案

一尘不染

尝试将脚手架下方的小部件树的一部分提取到单独的小部件中。您现在使用的上下文用于构建尚未导航的顶级窗口小部件。

产生的代码应如下所示:

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);
                    },

...

  }
}
2020-08-13