- 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个人想要将相同的产品添加到购物车中时,相反,让第一个点击按钮的人将产品添加到购物篮中,其他人将通过警报对话框得到通知。
1条答案
按热度按时间biswetbf1#
我认为您正在客户端之间创建争用条件。在我的所有Firestore实现中,我没有在
collection
或query
引用上使用await
。您应该只需要await
get()
方法本身。当您查看Flutter Firestore文档中的事务实现时,您会发现它们没有
await
顶部的集合引用。https://firebase.google.com/docs/firestore/manage-data/transactions#dart
取代:
尝试使用:
我希望这能有所帮助!我将尝试并把一个Firestore事务演示放在一起,看看我是否可以复制和解决您描述的问题。