首页 > 解决方案 > 使用 Flutter 在后台上传到 Firestore

问题描述

我正在使用 christocracy 的flutter_background_geolocation包来构建一个众包感知应用程序。这个应用程序非常依赖上述软件包的地理围栏功能。在主函数中,我实现了一个回调函数,如下(部分代码):

void _onGeofence(bg.GeofenceEvent event) async {
    await showGeofenceNotification(flutterLocalNotificationsPlugin,
        title: "Geofence", body: "$event", id: notification_id);

    if (action == "ENTER") {
      // update certain variables
      BarometerService.startBarometerService();
      BarometerService.floorChange.listen((floorChanges) {
        // update floor
        updateDatabase();
      });
    }
    else if (action == "EXIT") {
      // update certain variables
      BarometerService.stopBarometerService();
    }
    updateDatabase();
    setState(() {
      // update UI
    });
  }

当应用程序打开并处于焦点时,代码可以完美运行。但是,在后台时,气压计服务会停止。updateDatabase() 函数也没有执行,因为我的 Firestore 控制台没有更新。

下面是更新数据库的代码:

Future updateUserState(String matric, bool inLWN, bool inVaughan, String activity, int confidence, int floor) async {
    return await userCollection.document(uid).setData({
      'matric': matric,
      'inLWN': inLWN,
      'inVaughan': inVaughan,
      'activity': activity,
      'confidence': confidence,
      'floor': floor,
    });
  }

这是 BarometerService 的代码(使用 Flutter 传感器插件):

import 'package:sensors/sensors.dart';
static startBarometerService() {
    Stream<BarometerEvent> barometer10Events = barometerEvents.throttle(Duration(seconds:PERIOD_SECONDS));
    subscription = barometer10Events.listen(onBarometer);
    streamController = new StreamController();
  }

即使应用程序关闭或终止,如何让我的服务运行?我已经在我的无头回调函数中实现了相同的代码(更新 UI 除外),但除了更新我的(本地)变量和显示本地颤振通知之外,没有其他任何工作。

无头任务供参考:

void headlessTask(bg.HeadlessEvent headlessEvent) async {
  print('[BackgroundGeolocation HeadlessTask]: $headlessEvent');
  switch(headlessEvent.name) {
    case bg.Event.GEOFENCE:
      bg.GeofenceEvent geofenceEvent = headlessEvent.event;
      onHeadlessGeofence(geofenceEvent);
      print('- [Headless] GeofenceEvent: $geofenceEvent');
      break;
    case bg.Event.ACTIVITYCHANGE:
      bg.ActivityChangeEvent event = headlessEvent.event;
      onHeadlessActivityChange(event);
      print('- [Headless] ActivityChangeEvent: $event');
      break;
  }
}

除了 setState() 之外,onHeadlessGeofence 几乎与回调 _onGeofence 相同。

完整的代码可以在这里找到

标签: androidfirebaseflutterfirebase-realtime-databasegoogle-cloud-firestore

解决方案


推荐阅读