Как глобально слушать из блока флаттера?

Я реализую уведомления в своем приложении.

У меня есть Cubit, который будет выдавать состояния, когда приложение получает новое уведомление.

Это мой главный:

class MyApp extends StatelessWidget {

 @override
  Widget build(BuildContext context) {
    return MultiBlocProvider(
        providers: [
          ...
          BlocProvider<NotificationCubit>(
              create: (context) => sl<NotificationCubit>())
        ],
        child: MaterialApp(
          home: Splash(),
          onGenerateRoute: Routes.sailor.generator(),
          navigatorKey: Routes.sailor.navigatorKey,
        ));
  }
}

Я использую get_it для внедрения зависимостей.

Я попытался добавить BlocBuilder<NotificationCubit, NotificationState> на свой домашний экран, и он работает каждый раз, когда пользователь получает уведомление.

Моя цель - обработать уведомление глобально. Я пытался добавить слушателя при создании локтя, но это не сработало:

BlocProvider<NotificationCubit>(
          create: (context) => sl<NotificationCubit>()..listen((state) {
              if (state is NotificationReceived){
                  print("Notificaton received");
              }
           }))

person Matteo Antolini    schedule 22.02.2021    source источник


Ответы (1)


Я слышал, что использовать get_it с bloc - не лучшая идея ...

Особенно в вашем случае, когда вы предоставляете блок для всего дерева виджетов. Попробуйте предоставить блок без использования get_it, потому что у вас в любом случае будет доступ к нему во всем приложении.

Вот интересное видео об этом: https://youtu.be/THCkkQ-V1-8?t=6393

person csk    schedule 22.02.2021
comment
Я изменил sl<NotificationCubit>() на NotificationCubit( messaging: FirebaseMessaging(), localNotifications: FlutterLocalNotificationsPlugin()), но проблема не исчезла. Я использую get_it только для инициализации блоков. Когда мне нужно получить к ним доступ, я использую context.read() / _5 _... - person Matteo Antolini; 23.02.2021