Загрузить в Firestore в фоновом режиме с Flutter - PullRequest
0 голосов
/ 03 апреля 2020

Я использую пакет 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 ().

Полный код можно найти здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...