Flutter Firestore带where条件查询文档及data()调用报错如何解决?
报错1:a.exists提示未定义问题
根因
带where条件的集合查询调用get()后返回的是QuerySnapshot(集合查询快照)类型,该类型不存在exists属性,只有单文档查询返回的DocumentSnapshot才有exists属性。集合查询需要通过判断返回的文档列表是否为空,来确认是否存在匹配的商品。
修复示例
Future getDoc() async { // 条件查询返回QuerySnapshot QuerySnapshot querySnapshot = await FirebaseFirestore.instance .collection("users") .doc(user.uid) .collection("cart") .where("id", isEqualTo: 5) .get(); // 通过docs是否为空判断是否存在匹配商品 if (querySnapshot.docs.isNotEmpty) { // 商品已存在的逻辑 } else { // 商品不存在的逻辑 } }
报错2:snapshot.data()提示未定义问题
根因
- 你同时混用了
await和.then两种异步写法,逻辑执行顺序会出现混乱,优先统一用await写法可读性更高 - 这里拿到的
snapshot仍然是QuerySnapshot类型,本身没有data()方法,需要先从查询到的文档列表中取出匹配的文档对象,再调用data()获取字段值
完整可用的购物车去重逻辑
Future addToCart() async { // 本次要添加的商品ID、价格、购买数量 int targetProductId = 5; int productPrice = 119; int addQuantity = quantity1; // quantity1为你定义的本次要加的数量 QuerySnapshot querySnapshot = await FirebaseFirestore.instance .collection("users") .doc(user.uid) .collection("cart") .where("id", isEqualTo: targetProductId) .get(); if (querySnapshot.docs.isEmpty) { // 商品不存在,新增购物车记录 Map<String, dynamic> data = { "id": targetProductId, "price": productPrice, "quantity": addQuantity }; await FirebaseFirestore.instance .collection("users") .doc(user.uid) .collection("cart") .add(data); } else { // 商品已存在,累加购买数量 DocumentSnapshot productDoc = querySnapshot.docs.first; int oldQuantity = productDoc.get('quantity'); // 更新文档数量 await productDoc.reference.update({ "quantity": oldQuantity + addQuantity }); } }
内容的提问来源于stack exchange,提问作者Affechon
相关产品推荐
相关产品推荐

