我对Flutter 翼提供程序模式有问题.用户重定向到新屏幕后,找不到提供程序.

根据我之前的问题(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)上面找到正确的提供者.

我试着想办法解决这个问题,在谷歌上搜索了几个小时的答案,但没有成功……

感谢您的帮助.

EDIT

这是包含图案的UserRepository:

class UserRepository with ChangeNotifier {
  User user;
  Status _status = Status.Uninitialized;

  Status get status => _status;
  User get getUser => user;
...}

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

推荐答案

问题是:

您的ChangeNotifierProvider位于Home内部,但您正在try 访问outside Home.

提供程序是有作用域的.这意味着如果它位于小部件树中,则只有其后代可以访问它.因此,在您的代码中,只有Home个可以从提供程序中读取.

要解决此问题,请将提供程序移至MaterialApp以上:

ChangeNotifierProvider<UserRepository> (
  builder: (context) => UserRepository(),
  child: MaterialApp(
    home: Home(),
  ),
)

Dart相关问答推荐

构造函数:将预处理的参数存储在传递给最终字段的辅助变量中

在 Flutter 中从树中临 timeshift 除时保留小部件状态

如何在 Flutter Web 中动态更改 App Title?

一键式 Flutter 工具提示

Flutter:是否可以有多个 Futurebuilder 或一个 Futurebuilder 用于多个 Future 方法?

如何实现 Iterable

如何在streambuilder中查询firestore文档并更新listview

Flutter:Firebase FieldValue.serverTimestamp() 到 DateTime 对象

如何在动态链接中传递参数?

如何等待forEach完成异步回调?

如何根据用户在Flitter中的时间显示问候,如早上好、下午好或晚上好

Flutter 中的嵌套数据和 BLoC

Flutter-在屏幕上绘制图形

如何判断一个字符串是否可以是 json.decode

Dart 2:Future 和 Future 之间的区别

如何将 3 字节的 unicode 字符写为字符串文字

Dart: 必须取消 Stream 订阅并关闭 StreamSinks 吗?

GWT 与 Dart - 主要区别是什么? Dart 是 GWT 的潜在替代品吗?

有没有办法取消dartfuture ?

如何使用 Dart 将字符串解析为数字?