You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter后台上传用户位置至Firebase失败:Firebase实例未初始化问题

问题原因

flutter_background_service的后台服务运行在独立的Dart Isolate/进程中,和主APP进程完全隔离。你在主函数里调用的Firebase.initializeApp只在主进程生效,后台服务进程里并没有初始化Firebase,所以才会抛出No Firebase App '[DEFAULT]' has been created错误。

解决方案

需要在后台服务的入口函数OnStart中单独初始化Firebase,同时调整初始化顺序确保依赖正确。

修改后的完整代码

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 先初始化主进程的Firebase,供前台代码使用
  await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform);
  // 再启动后台服务
  await initializ();
  
  runApp(MaterialApp(
    home: First(),
  ));
}

Future initializ() async {
  final service = FlutterBackgroundService();
  await service.configure(
      iosConfiguration: IosConfiguration(),
      androidConfiguration:
          AndroidConfiguration(isForegroundMode: true, onStart: OnStart));
  await service.startService();
}

@pragma('vm:entry-point')
void OnStart(ServiceInstance service) async {
  // 关键:在后台服务的独立进程中初始化Firebase
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform);

  if (service is AndroidServiceInstance) {
    service.on('setAsForeground').listen((event) {
      service.setAsForegroundService();
    });

    service.on('setAsBackground').listen((event) {
      service.setAsBackgroundService();
    });
  }

  service.on('stopService').listen((event) {
    service.stopSelf();
  });

  Timer.periodic(const Duration(seconds: 2), (timer) async {
    if (service is AndroidServiceInstance) {
      if (await service.isForegroundService()) {
        try {
          Position position = await Geolocator.getCurrentPosition(
              desiredAccuracy: LocationAccuracy.high);
          String long = position.longitude.toString();
          String lat = position.latitude.toString();
          print(lat);
          
          // 现在Firebase已经在后台进程初始化,可以正常调用
          var db = FirebaseFirestore.instance;
          var users = db.collection("rashi");
          await users.add({"lat": lat, "lng": long}); // 修正字段名对应关系:lat存纬度,lng存经度
          
          service.setForegroundNotificationInfo(
              title: "Asif", content: "longitude : $long , latitude : $lat ");
        } catch (e) {
          // 捕获异常,方便调试后台服务错误
          print("后台服务错误:$e");
          if (service is AndroidServiceInstance) {
            service.setForegroundNotificationInfo(
                title: "错误", content: "上传失败:$e");
          }
        }
      }
    }
  });
}

额外注意事项

  1. 字段名修正:你原代码中把纬度lat存到了lng字段、经度long存到了lat字段,已修正避免数据混乱。
  2. 异常捕获:添加try-catch块,防止后台服务因异常崩溃,同时便于调试。
  3. 权限配置:确保已申请后台定位权限,Android需在AndroidManifest.xml中添加:
    <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    
  4. Firestore规则:测试阶段可暂时放开写入权限确保正常上传,上线前需改为严格规则:
    rules_version = '2';
    service cloud.firestore {
      match /databases/{database}/documents {
        match /{document=**} {
          allow read, write: if true;
        }
      }
    }
    

内容的提问来源于stack exchange,提问作者Dharwad City

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 10:24:56