Я собираюсь перенести большое приложение, написанное на Xamarin, и перейти на Flutter с Cloud Firestore в качестве бэкэнда. Поскольку Cloud Firestore все еще находится на стадии бета-тестирования, кажется, очень мало конкретных примеров , демонстрирующих лучшие практики при вызове из клиента Flutter.
В частности - кажется, что нет прямого подхода к проверке того, провалился ли TX или успешно ли он.
Итак, взяв в качестве примера стандартную операцию ' Удалить ' - каков наилучший подход к выполнению ваших собственных транзакций как в онлайн, так и в автономном режиме, включая обеспечение надлежащей обработки ошибок во Flutter?
Я расширил свое решение ниже (в методе удаления) , и вы можете видеть, что выполняются два сетевых вызова, один для получения ссылки на последний документ, а другой для выполнения удаления.
Однако, поскольку мы используем StreamBuilder, который получает обновления при изменении каких-либо документов, не можем ли мы предположить, что widget.documents [index] .reference будет содержать ссылку на последний документ и, следовательно, покончить с :
var snapshot=await tx.get(docReference)
if (snapshot.exists){
await tx.delete(snapshot.reference)
}
и просто используйте:
var docReference = widget.documents[index].reference;
await tx.delete(docReference);
Примечание
Оба вышеприведенных подхода работают - я придерживаюсь подхода, который на 100% соответствует тесту ACID в отношении транзакций, а также обеспечивает наилучшую производительность.
Пример использования
Подписка Streambuilder:
В FirestoreListView
создается ListView.Builder
, который добавляет кнопку удаления / редактирования, которая позволяет удалять или добавлять любой элемент, таким образом, мы имеем что-то вроде этого:
ListView:
За кнопкой удаления мы выполняем удаление как:
Удалить код: