提供集团的正确方法是什么?

时间:2020-04-26 04:19:05

标签: flutter bloc flutter-bloc

嗨,我是新手,我的问题是提供集团的正确方法是什么? 我决定在名为rout的主文件中提供主题,但是问题是当我需要其他集团内部的集团时,我无法提供它。 这是我的主文件路由部分,例如,问题是我想向AssetPage bloc提供AssetDevicesPageBloc bloc,我该怎么做,因为我没有访问权限。我是否以错误的方式提供集团?第一次,我想在一个地方提供所有集团,然后为每个小部件使用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(),
        ),

  },

1 个答案:

答案 0 :(得分:0)

之所以出现此问题,是因为在您调用它的上下文中该块不可用。

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

例如在MyApp窗口小部件中创建AssetDevicesPageBloc的实例。

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

然后将MaterialApp小部件与BlocProvider.value封装在一起,并提供这样创建的块:

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

现在,您可以使用:

在任何屏幕内的任何位置访问块。
BlocProvider.of< AssetDevicesPageBloc >(context)

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

assetDevicePageBloc?.close();

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

有关参考,请参见official documentation