为什么将块提供程序放在单独的文件/类中会引发错误?

Gwh*_*yyy 3 dart flutter bloc flutter-provider flutter-bloc

我有这个代码:

MultiBlocProvider(
  providers: [
    BlocProvider(
      create: (context) => CubitExample(),
    ),
  ],
  child: MaterialApp(
    home: Home(),
  ),
);
Run Code Online (Sandbox Code Playgroud)

它工作正常,我有很多肘节/块,所以我决定将提供者列表移动到一个单独的类:

MultiBlocProvider(
  providers: BlocProviders.blocs(),
  child: MaterialApp(
    home: Home(),
  ),
);
Run Code Online (Sandbox Code Playgroud)
// The class 
class BlocProviders {
  static List<BlocProvider> blocs() {
    return <BlocProvider>[
      BlocProvider(
        create: (context) => CubitExample(()),
      ),
    ];
  }
}
Run Code Online (Sandbox Code Playgroud)

现在抛出通常的块错误:

ProviderNotFoundException (Error: Could not find the correct Provider<ExampleCubit> above this BlocBuilder<ExampleCubit, ExampleState> Widget
Run Code Online (Sandbox Code Playgroud)

我不知道为什么当我尝试第二个代码时会抛出错误,为什么会抛出错误?

小智 6

我想我已经获得了一些见解

每当我们用 包装一个小部件时MultiBlocProvider,我们都会用一个子小部件给出其中的提供者列表。

所以我研究了它的实现,发现它接受BlocProviderSingleChildWidgetMultiBlocProvider类型的 List ,并且它是定义的 mixin ,这意味着我们不能使用 List。SingleChildWidget

现在,在您的情况下,您定义了这样的小部件类:

MultiBlocProvider(
  providers: BlocProviders.blocs(),
  child: MaterialApp(
    home: Home(),
  ),
);
Run Code Online (Sandbox Code Playgroud)

和你的集团类是这样的:

class BlocProviders {
  static List<BlocProvider> blocs() {
    return <BlocProvider>[
      BlocProvider(
        create: (context) => CubitExample(()),
      ),
    ];
  }
}
Run Code Online (Sandbox Code Playgroud)

在此您创建了类型为 的列表List<BlocProvider>,它不是BlocProviderSingleChildWidget. 因此它向您展示了您正在谈论的错误。

一个人通过使用该getter方法而不是静态函数回答了这个问题,并且它正在工作,因为他没有为列表提供任何类型(它是动态的),因此错误消失了。

现在,如果您想像您提到的那样使用您的类和函数,您几乎可以通过给它动态类型来使用它,如下所示:

class BlocProviders {
  static blocs() {
    return [
      BlocProvider(
        create: (context) => CubitExample(),
      ),
    ];
  }
}
Run Code Online (Sandbox Code Playgroud)

希望它能解决您所有与之相关的问题和疑问。此外,如果您想了解它,您可以查看 的实现MultiBlocProvider