flutter - 使用 Flutter 将 CRUD 操作应用于 Cloud Firestore 中的文档的推荐方法是什么?
问题描述
我正在考虑迁移一个用 Xamarin 编写的大型应用程序,并以Cloud Firestore作为后端迁移到 Flutter。由于 Cloud Firestore 仍处于测试阶段,从 Flutter 客户端调用时,似乎很少有具体示例展示最佳实践。
特别是 - 似乎没有直接的方法来检查 TX 是否失败或是否成功。
因此,以标准的“删除”操作为例 - 在在线/离线模式下滚动您自己的事务的最佳方法是什么,包括在 Flutter 中提供适当的错误处理?
我在下面扩展了我的解决方案(在 remove 方法中),您可以看到正在进行两个网络调用,一个用于获取最新的文档引用,另一个用于执行删除。
但是,由于我们使用 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
aListView.Builder
中添加了删除/编辑按钮,该按钮允许删除或添加任何项目,因此我们有这样的东西:
列表显示:
在删除按钮后面,我们执行删除:
删除代码:
解决方案
推荐阅读
- javascript - Javascript在工作线程中执行任务
- recursion - “log n”和“n”的存在如何影响这一点?因为有另一个函数相乘
- google-cloud-platform - 通过请求属性或 URL 路径限制对 GCE HTTP(S) 负载平衡器的访问
- node.js - Node.js IPv6 问题
- julia - 如何在 Automa.jl 中匹配以 \\ 开头的正则表达式
- python-3.x - 如何找到 conda 安装的软件包的位置,例如 pip show?
- c++ - 基于类型映射的运行时类型选择
- sql-server - SQL Server 表为特定数据类型占用过多空间
- python - Python Cryptography,值错误:使用 EC 密钥时无法反序列化密钥数据
- c++ - DJI OSDK 通过串口向 DJI Matrice 100 发送命令时的命令延迟