Я пытаюсь запустить эту следующую транзакцию в приложении флаттера.
var db = Firestore.instance;
var chatReference = db
.collection('Messages')
.document(groupChatId)
.collection("Chats")
.document(docId);
var newChatReference = db
.collection('NewMessages')
.document(groupChatId);
Firestore.instance.runTransaction((transaction) async {
DocumentSnapshot snap;
snap = await transaction.get(newChatReference);
storedTS = snap.data['timestamp'];
//'timestamp' is stored as string in the db
//storedTS will be compared with a given string later on
//update 'content' field (string) with new value
await transaction.update(
chatReference, {
'timestamp': DateTime.now().millisecondsSinceEpoch.toString(),
'content': 'My updated content',
},
).then((val) {
print('updated');
}).catchError((e) {
print('updateErr: $e');
});
if (storedTS == myCondition) {
//if true then also update this other document. If not, just ignore it.
//During test if it IS true, both docs are updated as expected.
// If it is NOT true, then the first update completes, since the console
shows
//updated. But in the db the value remains the same, which means it was
//rolled back just after being updated (or so I guess).
await transaction.update(
newChatReference, {
'timestamp': DateTime.now().millisecondsSinceEpoch.toString(),
}
).then((val) {
print('newChat TS updated');
}).catchError((e) {
print('updateErr newChat TS: $e');
});
}
}).catchError((e) {
print("rtError: $e");
});
Я получаю печать в консоли с надписью «обновлено», но в БД в коллекции ничего не меняется с первой операции обновления. Если я достану , если блок во втором обновлении, то он работает как ожидалось. Ошарашенный! Надеюсь, кто-то здесь может указать, что я делаю неправильно.