0

大家好,我是 Flutter 的新手,我的问题是提供集团的正确方法是什么?我决定在命名 rout 部分的主文件中提供主题,但问题是当我需要在其他 bloc 中的 bloc 时我无法提供它。这是我的主要文件路由部分问题是例如我想向assetPage bloc 提供一个AssetDevicesPageBloc 块我怎么能做这样的事情因为我没有访问权限。我是否以错误的方式提供集团?第一次我想在一个地方提供所有块然后为每个小部件使用 blockprovider.value 但是当我搜索它时,我发现它使用资源的错误方式。请帮助。谢谢

 return MaterialApp(
  routes: {
    'loginPage': (context) => BlocProvider(
          child: LogInPage(),
          create: (BuildContext context) {
            return LoginBloc(
                userRepository: userRepository,
                authenticationBloc:
                    BlocProvider.of<AuthenticationBloc>(context));
          },
        ),
    'AssetDevicePage': (context) => MultiBlocProvider(
          child: AssetDevicesPage(),
          providers: [
            BlocProvider(
                create: (BuildContext context) => AssetDevicesPageBloc(
                    userRepository: userRepository,
                    dataBaseRepository: dataBaseRepository,
                    deviceRepository: deviceRepository)),
            BlocProvider(
                create: (BuildContext context) => DeviceViewSwitcherBloc(
                    dataBaseRepository, userRepository, deviceRepository)),
            BlocProvider(
                create: (BuildContext context) =>
                    LampBloc(deviceRepository, dataBaseRepository)),
          ],
        ),

    'AssetPage': (context) => MultiBlocProvider(
          providers: [
            BlocProvider(
              create: (BuildContext context) =>
                  CategoryBloc(userRepository, dataBaseRepository),
            ),
            BlocProvider(
              create: (BuildContext context) =>
                  AssetPageBloc(BlocProvider.of<CategoryBloc>(context)),
            ),
          ],
          child: AssetPage(),
        ),

  },
4

1 回答 1

1

问题正在发生,因为该集团在您调用它的上下文中不可用。

您需要在 materialApp 小部件上方的第一个小部件中初始化 AssetDevicesPageBloc。

例如,在 MyApp Widget 中创建 AssetDevicesPageBloc 的实例。

AssetDevicesPageBloc assetDevicePageBloc = AssetDevicesPageBloc(
userRepository: userRepository,
dataBaseRepository: dataBaseRepository,
deviceRepository: deviceRepository)
);

比使用 BlocProvider.value 包装 MaterialApp 小部件并提供创建的块,如下所示:

BlocProvider.value(
  value: assetDevicePageBloc,
  child: MaterialApp(),
);

现在您可以使用以下命令在任何屏幕内的任何位置访问您的块:

BlocProvider.of< AssetDevicesPageBloc >(context)

但是请记住,如果您初始化 bloc,您应该在初始化它的小部件的 dispose 方法中关闭它的实例。所以打电话

assetDevicePageBloc?.close();

在您初始化assetDevicePageBloc 的小部件的dispose 方法中。

参考见官方文档

于 2020-04-26T05:41:22.550 回答