#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, один в основном приложении и один для фонового процесса.