如何正确地将期货与Flatter上的firebase交易关联起来?

如何正确地将期货与Flatter上的firebase交易关联起来?,firebase,google-cloud-firestore,flutter,Firebase,Google Cloud Firestore,Flutter,这是我的密码。成功返回false,因为文档长度为0 var sucess = await Firestore.instance.runTransaction((transaction) async { await transaction.set(userReference, userMap); }).then((_) { return Firestore.instance.collection(CollectionName.user).where(Fireb

这是我的密码。成功返回
false
,因为文档长度为0

   var sucess = await Firestore.instance.runTransaction((transaction) async {
      await transaction.set(userReference, userMap);
    }).then((_) {
      return Firestore.instance.collection(CollectionName.user).where(FirebaseUserField.uid, isEqualTo: userMap["uid"]).getDocuments();
    }).then((querySnapshot) {
      if (querySnapshot.documents.length == 0) {
        return false;
      }
      return true;
    }).catchError((e) {
      print(e);
      return false;
    });
这段代码进入了我的第二个未来,在那里我查询数据库中的用户,我刚刚用上一个事务更新了该用户。 我想把每件事都和未来联系起来,使错误检查变得简单

从Firestore文档中,我可以看到处理程序解析为事务的返回值,但调用事务的实例解析为空映射

runTransaction((事务)→ Future transactionHandler,{持续时间超时:常量持续时间(秒:5)})→ 未来

在事务完成后调用下一个future,或者在事务失败时出错的正确方法是什么

一个要考虑的问题是,当我用断点对用户进行查询时,就有一个延迟,我正确地得到用户。

此外,用户已正确写入我的数据库

编辑:我也试过了

var sucess = await Firestore.instance.runTransaction((transaction) async {
      return transaction.set(userReference, userMap);
    })

但它不起作用。

我认为它与事务中嵌套的
wait
有关,这也解释了调试期间看到的竞争条件

runTransaction
中使用此事务处理程序时会发生什么情况

(transaction) {
  return transaction.set(userReference, userMap);
}

你把未来和等待混为一谈。尝试删除Firestore.instance.runTransaction之前的第一个wait

var sucess = Firestore.instance.runTransaction((transaction) async {
      await transaction.set(userReference, userMap);
    }).then((_) {
      return Firestore.instance.collection(CollectionName.user).where(FirebaseUserField.uid, isEqualTo: userMap["uid"]).getDocuments();
    }).then((querySnapshot) {
      if (querySnapshot.documents.length == 0) {
        return false;
      }
      return true;
    }).catchError((e) {
      print(e);
      return false;
    });

您可能还需要从
await transaction.set(userReference,userMap)中删除
await
因为它会立即返回,并且有一个未来,但不是100%确定

相同,所以已经尝试过了。经过一番思考,竞争条件似乎与firebase server有关,事务在客户端结束,并立即启动新请求以获取文档,但firebase server也需要时间来处理事务。这只是我目前的猜测。我刚刚阅读了文档,当事务完成时,它是确定的,并且数据被写入。您是否尝试过不使事务处理程序异步,而只是返回
transaction.set
?在您的编辑中,处理程序仍然是异步的。我还没有尝试过,但据我从文档中记得的,异步函数不再作为微事务生成。我将尝试这样做