【问题标题】:How To Run Firebase Queries In An Isolate In Flutter如何在 Flutter 的隔离中运行 Firebase 查询
【发布时间】:2020-11-25 12:35:40
【问题描述】:

我正在尝试将文件上传到隔离中的 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();,所以我不知道我收到了这样的错误。

【问题讨论】:

  • 如果你放一些代码会更好地理解你的问题。
  • 您是否将 google-service.json 导入到您的项目文件夹中?也许你应该测试它是否在没有隔离的情况下工作。

标签: firebase flutter dart google-cloud-firestore dart-isolates


【解决方案1】:

Flutter 中的隔离体是完全隔离的,隔离。把它想成有点像进程(在这个意义上,两个隔离共享(几乎)没有内存),而不是在内存共享意义上的 Java 或 C 中的传统线程。

因此,如果您在主隔离区中启动 Firebase(就像您在 main 中所做的那样),则不会在其他隔离区中启动 Firebase。因此,请尝试在您的其他隔离区中再次初始化它。

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,无法在隔离区中运行 Firestore。 我最终使用 Timer 来处理它:

    _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();
    }
    

    【讨论】:

    • 那不是操作要求的内容
    猜你喜欢
    • 2018-11-12
    • 1970-01-01
    • 1970-01-01
    • 2020-06-24
    • 2022-12-30
    • 1970-01-01
    • 2023-03-22
    • 2021-06-17
    • 1970-01-01
    相关资源
    最近更新 更多