есть ли какой-либо способ обрабатывать непрерывные обновления в массиве firebase

#firebase #flutter #dart #google-cloud-firestore

# #firebase #flutter #dart #google-cloud-firestore

Вопрос:

Я работаю над приложением Flutter, в котором я постоянно прослушиваю устройство BLE, которое передает данные при любом изменении давления в шине. Это система контроля давления в шинах.

когда пользователь запускает новую поездку, я создаю документ этой поездки и начинаю прослушивать датчик давления на BLE.Всякий раз, когда он передает новое значение, я объединяю его в rideData массив. и он работает нормально.

Проблема возникает, когда я хочу остановить поездку, я напишу EndTime в тот же документ, и он закончится. но требуется некоторое время, пока он не опубликует все предыдущие значения, чтобы запустить хранилище, эти значения очень часты, и он продолжает нажимать на него. таким образом, завершение поездки похоже на ожидание в очереди своей очереди, а затем через некоторое время она завершает поездку.

Это должно произойти мгновенно, я попытался создать состояние и проверил, что данные о поездке будут отправлены только в том случае, если состояние равно false, при нажатии кнопки завершения поездки я установил это состояние, но даже тогда требуется время.

Изображение таблицы firebase

Вот мой код, который отправляет данные в firebase.

 void deviceData(firstDevice, secondDevice) async {
LocationData _locationData;
_locationData = await location.getLocation();
var firstDeviceData = parseManufacturerData(firstDevice);
var secondDeviceData = parseManufacturerData(secondDevice);
if (mounted) {
  print("mounted is $mounted");
  setState(() {
    frontPressure = (firstDeviceData["pressure"]);
    frontTemperature = (firstDeviceData["temperature"]);
    rearPressure = (secondDeviceData["pressure"]);
    rearTemperature = (secondDeviceData["temperature"]);
  });
}

var newData = {
  "lat": _locationData.latitude,
  "long": _locationData.longitude,
  "time": new DateTime.now(),
  "front": firstDeviceData,
  "rear": secondDeviceData
};
if (!isEnding) {
  auth.currentUser().then((value) async {
    if (value != null) {
      if (value.uid != null) {
        Firestore.instance
            .collection("userCurrentRides")
            .where('user', isEqualTo: value.uid)
            .where('isActive', isEqualTo: true)
            .snapshots()
            .first
            .then((event) {
          event.documents.first.data;
          if (event.documents.length > 0) {
            print(newData);
            String docId = event.documents.first.documentID;
            Firestore.instance
                .collection('userCurrentRides')
                .document(docId)
                .updateData(
              {
                "rideData": FieldValue.arrayUnion([newData])
              },
            ).then((value) {
              print('new update');
            });
          }
        });
      }
    }
  });
  }
 }
 

Для остановки работы я использую следующую функцию

 void stopRide(context) {
    setState(() {
      isEnding = true;
      frontPressure = "0.0";
      frontTemperature = "0.0";
      rearPressure = "0.0";
      rearTemperature = "0.0";
    });
    flutterBlue.stopScan();
    if (currentSubscription != null) {
      currentSubscription.cancel();
    }
    auth.currentUser().then((value) async {
      if (value != null) {
        Firestore.instance
            .collection("userCurrentRides")
            .where('user', isEqualTo: value.uid)
            .where('isActive', isEqualTo: true)
            .snapshots()
            .first
            .then((currentRideSnapshot) {
          var local = currentRideSnapshot.documents.first.data;
          local["endTime"] = new DateTime.now();

          String docId = currentRideSnapshot.documents.first.documentID;
          Firestore.instance
              .collection('userCurrentRides')
              .document(docId)
              .setData({"endTime": new DateTime.now(), "isActive": false},
                  merge: true).then((value2) {
            Firestore.instance
                .collection("userCurrentRides")
                .where('user', isEqualTo: value.uid)
                .snapshots()
                .first
                .then((currentRideSnapshot) {
              _progressHUD.state.dismiss();
              Navigator.pop(context, true);
            });
          });
        });
      }
    });
  }
 

Комментарии:

1. Как часто выполняется этот deviceData() метод? Он не очень оптимизирован для частого использования (несколько раз в секунду).

2. это зависит от частоты вещания с устройства, иногда может составлять 10 раз в секунду