Флаттер работает с приложением в фоновом режиме

#flutter

Вопрос:

У меня возникли проблемы с использованием GetIt, пока приложение находится в фоновом режиме. С приложением в фокусе все работает отлично, но в тот момент, когда я переключаю фокус, все ломается. В чем моя ошибка здесь?

Я использую GetIt 6.1.1, flutter 2.0.5, вот трассировка стека

 I/flutter ( 5125): FlutterFire Messaging: An error occurred in your background messaging handler:
I/flutter ( 5125): 'package:get_it/get_it_impl.dart': Failed assertion: line 315 pos 7: 'instanceFactory != null': Object/factory with  type NotificationCubit is not registered inside GetIt. 
I/flutter ( 5125): (Did you accidentally do GetIt sl=GetIt.instance(); instead of GetIt sl=GetIt.instance;
I/flutter ( 5125): Did you forget to register it?)
 

Вот моя настройка GetIt

get_it.dart

 GetIt getIt = GetIt.instance;

void setupGetIt() {
  getIt.registerSingleton<NotificationCubit>(NotificationCubit());
}
 

главная.дротик

 void main() async {
  // some other methods
  setupGetIt();
  runApp(MyApp());
}
 

И метод, который выдает ошибку.

 void _handleMessage(RemoteMessage message) {
  getIt
      .get<NotificationCubit>()
      .addNotification(NotificationClassName.fromRemoteMessage(message));

  _displaySnackBar(message);
}
 

Ответ №1:

Вам нужно позвонить setupGetIt(); еще раз в свой _handleMessage , код становится:

 void _handleMessage(RemoteMessage message) {
   
   //Add it here
   setupGetIt();
   getIt
    .get<NotificationCubit>()
    .addNotification(NotificationClassName.fromRemoteMessage(message));

  _displaySnackBar(message);
 }
 

Ошибка возникает из-за того, что при _handleMessage вызове метода компилятору не удается найти getIt.registerSingleton<NotificationCubit>(NotificationCubit()); , какие регистры NotificationCubit> .

Комментарии:

1. Это сработало для меня, но возникла другая проблема — экземпляры были другими, когда я проверил это в отладчике. Все это происходит в обработчике backgroundMessage, если это не было ясно. Например, у меня была та же проблема с SharedPreferences, вы случайно с этим не сталкивались?

2. Попробуйте инициализировать SharedPreferences до setupGetIt() в фоновом обработчике, а затем дайте мне знать.

3. Ну, и как бы я это сделал? Насколько я знаю, SharedPreferences не должны инициализироваться. Пример мог бы быть лучше. Я открываю приложение и сохраняю значение в ключе «уведомления», после получения префиксов в фоновом обработчике значения больше нет, так как есть два экземпляра SharedPreferences, один в основном приложении и один для фонового процесса.