使用runTransaction的Flutter / Firebase Firestore不执行任何操作

时间:2019-03-17 03:41:00

标签: firebase dart flutter google-cloud-firestore

嗨,我正在尝试使用Flutter中的Firebase Firestore实现简单的事务。这个过程很简单,只需更新两个文档,如下所示:

DocumentSnapshot productSnapshot = await productReference.get();
    DocumentSnapshot userSnapshot = await userReference.get();
    DocumentSnapshot userProductSnapshot = await userProductReference.get();
    if (productSnapshot.exists &&
        userSnapshot.exists &&
        userProductSnapshot.exists) {
      double price = double.parse(productSnapshot.data["productPrice"].toString());
      double money = double.parse(userSnapshot.data["money"].toString());
      double afterBuyMoney = money - price;
      if (afterBuyMoney >= 0) {
        await userReference.updateData({"money": afterBuyMoney});
        await userProductReference.updateData(({"isOwned": true}));
        response = "success";
      }
    }

此代码已经可以正常工作,并且可以在云数据库中更新数据的同时获得预期的结果,但是,由于存在两个事务,因此中间事务可能会出错。我想使用Firestore runTransaction实施此操作,因此,如果发生错误,将回滚所有事务。

这是我使用Firestore runTransaction的代码

await Firestore.instance.runTransaction((transaction) async {
      DocumentSnapshot productSnapshot = await transaction.get(productReference);
      DocumentSnapshot userSnapshot = await transaction.get(userReference);
      DocumentSnapshot userProductSnapshot = await transaction.get(userProductReference);
      if(productSnapshot.exists && userSnapshot.exists && userProductSnapshot.exists) {
        double price = double.parse(productSnapshot.data["productPrice"].toString());
        double money = double.parse(userSnapshot.data["money"].toString());
        double afterBuyMoney = money - price;
        if (afterBuyMoney >= 0) {
          await transaction.update(userReference, {"money": afterBuyMoney});
          await transaction.update(userProductReference,({"isOwned": true}));
          response = "success";
        }
      }
    }).then((_) {
      print("Success");
    }).catchError((error) {
      response = error.message;
    });

此代码也可以正常工作并打印“成功”,但是在Firestore数据库中,数据未更新,尽管日志中没有错误,但交易似乎不起作用。我的代码中是否缺少任何步骤或错误?该如何解决?

2 个答案:

答案 0 :(得分:3)

尝试:

Future<bool> insert() async {
    String document = "document";
    String collection = "collection";
    Map map = new Map();
    map["last_name"] = "Last Name";
    map["first_name"] = "First Name";
    map["middle_name"] = "Middle Name";

    DocumentReference documentReference = Firestore.instance.collection(collection).document(document);
    Firestore.instance.runTransaction((transaction) async {
      await transaction
          .set(documentReference, {
            'last_name': map['last_name'],
            'first_name': map['first_name'],
            'middle_name': map['middle_name']
          })
          .catchError((e) {})
          .whenComplete(() {});
    }).catchError((e) {
      return false;
    });

    return true;
}

答案 1 :(得分:0)

我提供了一种可能的解决方案HERE,该解决方案用于切换您使用的Flutter的版本。