#firebase #flutter #dart #google-cloud-firestore #dart-isolates
# #Firebase #Flutter #dart #Google-облако-Firestore #dart-изолирует
Вопрос:
Я пытаюсь загрузить файлы в хранилище Firebase в изоляции, но, похоже, это не работает. Я продолжаю получать следующие исключения:
E/flutter ( 1527): [ERROR:flutter/lib/ui/ui_dart_state.cc(166)] Unhandled Exception: [core/no-app] No Firebase App '[DEFAULT]' has been created - call Firebase.initializeApp()
E/flutter ( 1527): #0 MethodChannelFirebase.app (package:firebase_core_platform_interface/src/method_channel/method_channel_firebase.dart:118:5)
E/flutter ( 1527): #1 Firebase.app (package:firebase_core/src/firebase.dart:52:41)
E/flutter ( 1527): #2 FirebaseFirestore.instance (package:cloud_firestore/src/firestore.dart:43:21)
E/flutter ( 1527): #3 new ForumsProvider (package:trumate/src/providers/forums.provider.dart:31:41)
E/flutter ( 1527): #4 CommonProvider.videoPost (package:trumate/src/providers/common.provider.dart:100:29)
E/flutter ( 1527): <asynchronous suspension>
E/flutter ( 1527): #5 CommonProvider.backgroundVideoUpload (package:trumate/src/providers/common.provider.dart:112:5)
E/flutter ( 1527): #6 FlutterIsolate._isolateInitialize.<anonymous closure>.<anonymous closure> (package:flutter_isolate/flutter_isolate.dart:128
Для этого я использую плагин flutter_isolate: ^ 1.0.0 14. Но, похоже, проблема заключается в выполнении запросов Firebase внутри изоляции.
У моего основного есть await Firebase.initializeApp();
, поэтому я не знаю, что получаю такую ошибку.
Комментарии:
1. если вы добавите какой-нибудь код, будет лучше понять вашу проблему.
2. Вы импортировали файл google-service.json в папку вашего проекта? И, возможно, вам следует проверить, работает ли он без изоляции.
Ответ №1:
Изоляты во Flutter полностью изолированы. Подумайте об этом немного как о процессах (в том смысле, что два изоляты не разделяют (почти) никакой памяти), вместо традиционных потоков в Java или C в смысле совместного использования памяти.
Поэтому, если вы инициализируете свою Firebase в своем основном изоляте (как то, что вы сделали в main
), Firebase не будет инициализирована в других ваших изолятах. Таким образом, попробуйте инициализировать его снова в других ваших изолятах.
Ответ №2:
flutter_isolate: ^2.0.2
onPressed: () {
FlutterIsolate.spawn(_isolateEntrypoint, "foo");
}
// A "top level" function (i.e. not inside a class or make it static)
_isolateEntrypoint(String foo) {
WidgetsFlutterBinding.ensureInitialized();
...
}
Убедитесь, что авторизация и инициализация были выполнены в одном и том же основном потоке (верхнем уровне или статическом).
Теперь этот FlutterEngine сможет взаимодействовать с хранилищем Firebase.
Ответ №3:
У меня была такая же проблема, и я не смог запустить Firestore в изолированном хранилище. В итоге я использовал таймер для его обработки:
_MyAppState() {
_timer = new Timer.periodic(Duration(seconds: 2), (timer) async {
//Call function that handles firestore
var upload = await fireUpload();
//Returns value to despose timer if job is completed
if (upload == false){
dispose();
}
});
}
//Kills the Timer function
@override
void dispose() {
super.dispose();
_timer.cancel();
}
Комментарии:
1. это не то, о чем спрашивает op