android - 使用 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 相同。
完整的代码可以在这里找到
解决方案
推荐阅读
- python - Matplotlib/Seaborn:如何在 x 轴的上边缘绘制地毯图?
- swift - ARKit 中的 FaceTracking – 如何在屏幕上显示“lookAtPoint”
- python-3.x - 类型错误:register_user() 缺少 1 个必需的位置参数:'self'
- rstudio - knitr 和 sweave 之间的转换
- javascript - 本地主机上的快速获取请求:3000 不起作用
- c++ - 如何正确打印内存中变量的地址?
- c# - Autofac - 获取其接口实现特定接口的类的所有实例
- powerbi - Power BI Desktop - 一张显示最近发票超过 100 万美元的卡片
- ruby-on-rails - 通过匹配条件从哈希数组中获取电子邮件作为数组
- amazon-web-services - 使用 Brave 浏览器从控制台上传 S3 失败