使用Firebase是否可以防止两个人同时向购物车添加产品?

fjaof16o  于 2023-02-09  发布在  其他
关注(0)|答案(1)|浏览(119)
    • bounty将在5天后过期**。回答此问题可获得+50的声誉奖励。Alakbar Heydarov正在寻找来自声誉良好来源的答案

我正在使用Firebase DB with Flutter导入产品目录。只有1个人可以将产品添加到购物车。如果2个或更多人同时想将产品添加到购物车,产品将添加到所有人。我该怎么做才能收回此信息?

void addBasket(Map<String, dynamic> data, index) async {

    var _storage = await GetStorage();

    final CollectionReference user_basket =
        await FirebaseFirestore.instance.collection('user basket');
    final CollectionReference product =
        await FirebaseFirestore.instance.collection('product');
    final DocumentReference ref = await product.doc(data['id']);
    await FirebaseFirestore.instance.runTransaction((Transaction tx) async {
      DocumentSnapshot snap = await tx.get(ref);
      if (snap.exists) {
       await product.doc(data['id']).delete();
        await tx.update(ref, data);

      await  user_basket
            .doc(_storage.read('uid'))
            .collection('basket')
            .doc(data['id'])
            .set(data);
        inArea.removeAt(index);
        Get.back();
        Get.back();
      } else {
      await  user_basket
            .doc(_storage.read('uid'))
            .collection('basket')
            .doc(data['id'])
            .delete();
        Get.back();
        Get.defaultDialog(
            title: "Wrong",
            middleText:
                "This product is being reviewed by another person.");
      }
    });
  }

我尝试使用交易,你可以看到在代码。我测试了这个代码,我第一次写它。当两个人同时按下按钮,其中一个可以添加产品到购物车。我想今天再测试一次。我按下添加产品到购物车按钮,结果If和Else的博客都起作用了。所以我开始收到错误。我想得到的确切结果是当超过1个人想要将相同的产品添加到购物车中时,相反,让第一个点击按钮的人将产品添加到购物篮中,其他人将通过警报对话框得到通知。

biswetbf

biswetbf1#

我认为您正在客户端之间创建争用条件。在我的所有Firestore实现中,我没有在collectionquery引用上使用await。您应该只需要awaitget()方法本身。
当您查看Flutter Firestore文档中的事务实现时,您会发现它们没有await顶部的集合引用。
https://firebase.google.com/docs/firestore/manage-data/transactions#dart
取代:

final CollectionReference user_basket =
    await FirebaseFirestore.instance.collection('user basket');
final CollectionReference product =
    await FirebaseFirestore.instance.collection('product');
final DocumentReference ref = await product.doc(data['id']);

尝试使用:

final CollectionReference user_basket = FirebaseFirestore.instance.collection('user basket');
final CollectionReference product = FirebaseFirestore.instance.collection('product');
final DocumentReference ref = product.doc(data['id']);

我希望这能有所帮助!我将尝试并把一个Firestore事务演示放在一起,看看我是否可以复制和解决您描述的问题。

相关问题