【问题标题】:Could not find the correct Provider above this Consumer Widget在此消费者小部件上方找不到正确的提供者
【发布时间】:2021-07-04 01:49:07
【问题描述】:

我使用Provider 作为我的颤振应用程序的状态管理工具。这是我的提供程序配置。

runApp(MultiProvider(providers: [ ChangeNotifierProvider(
        create: (_) => AuthenticationProvider(
          AuthenticationService(AuthenticationApi.development()),
        ),
      ),
      ChangeNotifierProxyProvider<AuthenticationProvider, TransactionProvider?>(
        create: null,
        update: (context, authenticationProvider, transactionProvider) {
          return TransactionProvider(
            TransactionService(
              TransactionApi.development(authenticationProvider.token),
            ),
          );
        },
      )
], child: MyApp()));

但是当我使用 TransactionProvider 时,我得到了 provider not found 错误。这是我的构建方法。

Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text('Test'),
        ),
        body: Consumer<TransactionProvider>(
            builder: (context, transactionProvider, child) {
          return Center(
            child: Text('Home'),
          );
        }));
  }

这是错误信息。

Error: Could not find the correct Provider<TransactionProvider> above this Consumer<TransactionProvider> Widget

我们的目标是只有在通过AuthenticationProvider 验证成功后才能初始化TransactionProvider。我在这里做错了什么?

【问题讨论】:

    标签: flutter dart mobile-application flutter-provider


    【解决方案1】:

    在 main 上创建类似的提供程序。

    runApp(
                  MultiProvider(
                providers: [
                  ChangeNotifierProvider(create: (_) => TransactionProvider(TransactionService(
        TransactionApi.development(authenticationProvider.token)
        ));
        )),
                ],
                child: MyApp(),
              ));
    

    【讨论】:

    • 对不起,我没听懂。
    【解决方案2】:

    问题是,我在下面的部分将TransactionProvider 初始化为null

    ChangeNotifierProxyProvider<AuthenticationProvider, TransactionProvider?>(
            create: null,
            update: (context, authenticationProvider, transactionProvider) {
              return TransactionProvider(
                TransactionService(
                  TransactionApi.development(authenticationProvider.token),
                ),
              );
            },
          )
    

    由于这个Provider 无法按类型找到正确的提供程序。一旦我像下面这样改变它就可以工作了。

    ChangeNotifierProxyProvider<AuthenticationProvider, TransactionProvider>(
              create: (BuildContext context) {
            return TransactionProvider(TransactionService(
                TransactionApi.development(
                    Provider.of<AuthenticationProvider>(context, listen: false)
                        .token)));
          }, update: (context, authenticationProvider, transactionProvider) {
            return TransactionProvider(TransactionService(
                TransactionApi.development(authenticationProvider.token)));
          })
    

    我最初的想法是 TransactionProvider 不应该在 AuthenticationProvider 被初始化之前被初始化。所以我们初始化为null,只写了更新方法。但是为了识别代码,我们应该初始化。由于初始化和更新几乎立即被调用,访问TransactionProvider 没有问题。

    【讨论】:

      猜你喜欢
      • 2020-05-19
      • 2020-08-09
      • 2019-11-29
      • 2021-11-18
      • 2021-01-13
      • 2021-07-22
      • 2021-01-06
      相关资源
      最近更新 更多