首页 > 解决方案 > 如何在 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 中执行一批命令而不会丢失离线功能?

标签: flutterfirebase-realtime-databaseoffline

解决方案


可以进行多路径更新以事务方式执行这两个写入:

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


推荐阅读