【问题标题】:Flutter: Dependency Injecting using Multiprovider and Consumer in the same treeFlutter:在同一棵树中使用 Multiprovider 和 Consumer 进行依赖注入
【发布时间】:2020-06-08 06:04:43
【问题描述】:

我正在尝试将服务实例(已在同一树级别创建)注入另一个提供程序。但是在访问提供程序时,我得到了ProviderNotFoundException 异常。 在下面的代码中NotificationService 依赖于AuthService。这需要在构造函数中传递。因此,我使用ConsumerProvider.value 注入它,如文档中所述:https://pub.dev/documentation/provider/latest/provider/Consumer-class.html

这是伪代码:

return MultiProvider(
    providers: [
      Provider<AuthService>(
        create: (ctx) => AuthService(_storage),
        dispose: (ctx, v) => v.dispose(),
      ),
      Consumer<AuthService>(
        builder: (context, v, child) {
          return Provider.value(
              value: Provider<NotificationService>(
                create: (ctx) => NotificationService(v),
                dispose: (ctx, v) => v.dispose(),
              ),
              child: child
          );
        },
      )
    ],
    child: MyApp()
);

在树线的某处,当尝试访问NotificationService 实例时,我得到ProviderNotFoundException

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final NotificationService _ns = Provider.of<NotificationService>(context);
  }
}

错误:

I/flutter ( 4614): ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
I/flutter ( 4614): The following ProviderNotFoundException was thrown building MyApp(dirty, dependencies:
I/flutter ( 4614): [_DefaultInheritedProviderScope<AuthService>]):
I/flutter ( 4614): Error: Could not find the correct Provider<NotificationService> above this MyApp Widget
I/flutter ( 4614): 
I/flutter ( 4614): To fix, please:
I/flutter ( 4614): 
I/flutter ( 4614):   * Ensure the Provider<NotificationService> is an ancestor to this MyApp Widget
I/flutter ( 4614):   * Provide types to Provider<NotificationService>
I/flutter ( 4614):   * Provide types to Consumer<NotificationService>
I/flutter ( 4614):   * Provide types to Provider.of<NotificationService>()
I/flutter ( 4614):   * Ensure the correct `context` is being used.
I/flutter ( 4614): 

我不完全理解这一点,我很确定上面的代码有一个错误。我究竟做错了什么?

【问题讨论】:

    标签: android flutter dependency-injection flutter-provider


    【解决方案1】:

    您使用Provider.value的方式无效。但你实际上并不需要Consumer+Provider。你可以这样做:

    MultiProvider(
      providers: [
        Provider(create: (_) => A()),
        Provider(create: (context) => B(Provider.of<A>(context, listen: false)),
      ],
    )
    

    【讨论】:

    • 谢谢。这解决了它。我浏览了 api 文档:pub.dev/documentation/provider/latest/provider/Provider/of.html。但我无法真正理解这个解释,listen: false 到底做了什么?
    • @dora 查看我的answer here 以更好地了解监听标志。它也引用了文档。
    • @Rémi 如果想要在更新Provider A 时更新Provider B,那么我们需要为B 使用ProxyProvider。如果我错了,请纠正我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-26
    • 2014-01-19
    • 2014-03-25
    • 2019-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多