Как запускать запросы Firebase в изоляции в Flutter

#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