flutter - 如何在 Firebase RTDB 中进行离线批处理?
问题描述
我有理由相信某些ServerValue.increment()
命令没有执行。
在我的应用程序中,当用户提交时,会执行两个命令:
Future<void> _submit() async {
alimentoBloc.descontarAlimento(foodId, quantity);
salidaAlimentoBloc.crearSalidaAlimento(salidaAlimento);
}
第一个命令更新仓库中剩余的库存量(使用 ServerValue.increment)...
Future<bool> descontarAlimento(String foodId, int quantity) async {
try {
dbRef.child('inventory/$foodId/quantity')
.set(ServerValue.increment(-quantity));
} catch (e) {
print(e);
}
return true;
}
第二个命令创建一个食物输出寄存器,记录食物的数量、类型和其他关键数据。
Future<bool> crearSalidaAlimento(SalidaAlimentoModel salidaAlimento) async {
try {
dbRef.child('output')
.push().set(salidaAlimento.toJson());
} catch (e) {
print(e);
}
return true;
}
经过几次审核,我注意到有时没有执行增加命令,然后库存与应有的不对应。
然后,我想做一些类似于事务的事情,这是:如果两个命令都没有执行,则不要执行这两个命令中的任何一个。
是否可以在 Firebase Realtime 中执行一批命令而不会丢失离线功能?
解决方案
您可以进行多路径更新以事务方式执行这两个写入:
var id = dbRef.push().key;
Map<String, dynamic> updates = {
"inventory/$foodId/quantity": ServerValue.increment(-quantity),
"output/$id": salidaAlimento.toJson()
}
dbRef.update(updates);
有了上述,要么两个写入都完成了,要么都没有完成。
当您离线时,客户端将根据其对服务器当前值的最佳猜测触发本地事件(0
如果它从未读取过该值),然后它会将所有待处理的更改发送到服务器重新连接。如需快速测试,请参阅https://jsbin.com/wuhuyih/2/edit?js,console
推荐阅读
- visual-studio - 如何从 Visual Studio 资源编辑器将图标序列化为资源 (.resx) 文件?
- javascript - Sweetalert 使用 ajax 和 php 提交 inputValue
- flutter - Gradle - 对等连接重置
- c# - 使用 C# 更高效地创建 zip 文件
- optimization - 如何通过最小化具有多个变量和条件的函数来进行优化
- machine-learning - 嵌套交叉验证:不确定我是否理解这段代码,以及它是否真的在最后展示了最好的模型
- javascript - `@types/node` 的最新更新版本正在创建一个错误。以前的版本运行良好
- python - 具有约束和多个输入的子集和问题
- lua - 保存到文件时尝试将表插入表而不创建新表
- github-pages - Nuxt - 你能预渲染元数据吗?