Как правильно предоставить бл c? - PullRequest
0 голосов
/ 26 апреля 2020

Привет, ребята, я новичок во флаттере, и мой вопрос в том, как правильно предоставить блок c? Я решил предоставить тему в главном файле в именованном разделе маршрутизации, но проблема в том, что когда мне нужен блок blo c внутри другого блока blo c, я не могу его предоставить. Вот мой основной раздел маршрутов файлов, проблема в том, например, что я хочу предоставить AssetDevicesPageBlo c blo c для assetPage blo c, как я могу сделать такую ​​вещь, потому что у меня нет доступа. я не предоставляю блоки неправильно? В первый раз я хотел предоставить все блоки в одном месте, а затем использовать blockprovider.value для каждого виджета, но когда я искал об этом, я обнаружил, что это неправильный способ использования resources.please help.thank you

 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 голосов
/ 26 апреля 2020

Проблема возникает из-за того, что blo c недоступен в контексте, из которого вы его вызываете.

Вам нужно инициализировать AssetDevicesPageBlo c в самом первом виджете над виджетом materialApp. .

Например, в виджете MyApp создайте экземпляр AssetDevicesPageBlo c.

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

Чем оберните виджет MaterialApp с BlocProvider.value и предоставьте созданный блок blo c следующим образом :

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

Теперь вы можете получить доступ к своему блоку в любом месте на любом экране, используя:

BlocProvider.of< AssetDevicesPageBloc >(context)

Но помните, что если вы инициализируете блок blo c, вы должны закрыть его экземпляр в dispose метод виджета, в котором вы его инициализировали. Поэтому вызовите

assetDevicePageBloc?.close();

в методе dispose инициализированного вами виджета assetDevicePageBlo c.

. Для справки см. Официальную документацию

...