#firebase #flutter #dart #google-cloud-firestore
# #firebase #flutter #dart #google-cloud-firestore
Вопрос:
Я работаю над приложением Flutter, в котором я постоянно прослушиваю устройство BLE, которое передает данные при любом изменении давления в шине. Это система контроля давления в шинах.
когда пользователь запускает новую поездку, я создаю документ этой поездки и начинаю прослушивать датчик давления на BLE.Всякий раз, когда он передает новое значение, я объединяю его в rideData
массив. и он работает нормально.
Проблема возникает, когда я хочу остановить поездку, я напишу EndTime в тот же документ, и он закончится. но требуется некоторое время, пока он не опубликует все предыдущие значения, чтобы запустить хранилище, эти значения очень часты, и он продолжает нажимать на него. таким образом, завершение поездки похоже на ожидание в очереди своей очереди, а затем через некоторое время она завершает поездку.
Это должно произойти мгновенно, я попытался создать состояние и проверил, что данные о поездке будут отправлены только в том случае, если состояние равно false, при нажатии кнопки завершения поездки я установил это состояние, но даже тогда требуется время.
Вот мой код, который отправляет данные в 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 раз в секунду