Я использую пакет flutter_background_geolocation
от christocracy, чтобы создать приложение для определения толпы. Это приложение довольно сильно полагается на функцию геозоны вышеупомянутого пакета. В основной функции я реализовал функцию обратного вызова, которая выглядит следующим образом (частичный код):
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();
}
Как заставить мои службы работать, даже когда приложение закрыто или завершено? Я реализовал тот же код в моих функциях обратного вызова без головы (кроме обновления пользовательского интерфейса), но ничего, кроме обновления моих (локальных) переменных и показа локальных уведомлений о флаттере, не работает.
Безголовое задание для справки:
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;
}
}
onHeadlessGeofence почти идентично обратному вызову _onGeofence, кроме setState ().
Полный код можно найти здесь