首页 > 解决方案 > Flutter Provider-Consumer 异常错误

问题描述

代码在几周前运行良好,然后突然我在日志中得到了这个。

I/flutter (14128):══╡ 小部件库发现的异常

I/flutter (14128):在构建 Consumer(dirty) 时引发了以下 ProviderNotFoundException:

I/flutter (14128):错误:在此消费者小部件上方找不到正确的提供者

I/flutter (14128):提供者是“范围的”。因此,如果您在路由中插入提供程序,则 I/flutter (14128): 其他路由将无法访问该提供程序。

I/flutter (14128): - 你使用了BuildContext一个你试图读取的提供者的祖先。

I/flutter (14128):确保 Consumer 在您的 MultiProvider/Provider 下。

I/flutter (14128):这通常发生在您创建提供程序并尝试立即读取它时。

I/flutter (14128):例如,而不是:

   Widget build(BuildContext context) {
     return Provider<Example>(
    create: (_) => Example(),
    // Will throw a ProviderNotFoundError, because `context` is associated
    // to the widget that is the parent of `Provider<Example>`
     child: Text(context.watch<Example>()),
     ),
  }

I/flutter (14128):考虑builder像这样使用:

   Widget build(BuildContext context) {
   return Provider<Example>(
   create: (_) => Example(),
   // we use `builder` to obtain a new `BuildContext` that has access to the provider
   builder: (context) {
   // No longer throws
   return Text(context.watch<Example>()),
   }
   ),
   }

I/flutter (14128):如果这些解决方案都不起作用,请考虑在 StackOverflow 上寻求帮助:

I/flutter (14128):相关的导致错误的小部件是:

我/颤振(14128):消费者

我/颤振(14128):/lib/custom_widgets/favorite_widget.dart:18:12

I/flutter (14128):抛出异常时,这是堆栈:

I/flutter (14128): #0 Provider._inheritedElementOf (package:provider/src/provider.dart:309:7)

I/flutter (14128): #1 Provider.of (package:provider/src/provider.dart:261:30)

I/flutter (14128): #2 Consumer.buildWithChild (package:provider/src/consumer.dart:177:16) ═══════════════════════ ═══════════════════════════════════════════

I/flutter (14128):抛出了另一个异常:错误:在此之上找不到正确的提供程序

就是这样(当前)

  Widget build(BuildContext context) {
  return Consumer<FavoriteModel>(
    builder: (context, house, child) => IconButton(
          onPressed: () {

这是在我更改它以尝试按照错误中的方法修复它之后(但不起作用)

    Widget build(BuildContext context) {
  return Provider<FavoriteModel>(
  create: (_FavoriteWidgetState) => FavoriteModel,
    builder: (context, house, child) {
    return Text(context.watch<FavoriteModel>());
    IconButton(
          onPressed: ()

标签: flutterdart

解决方案


尝试在 main.dart 文件中添加 ChangeNotifier。就像下面的例子:

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    /// wrap MaterialApp in Provider widget
    return ChangeNotifierProvider(
      create: (context) => YourModel(), // ← create/init your state model
      child: MaterialApp(
          home: ScreenA()
      ),
    );
  }
}```

推荐阅读