You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()提示未定义问题

根因

  1. 你同时混用了await和.then两种异步写法,逻辑执行顺序会出现混乱,优先统一用await写法可读性更高
  2. 这里拿到的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 17:06:03