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

Flutter应用Firestore无法获取当前用户数据,显示“No data found”

排查Flutter Firestore数据不显示(No data found)及权限错误问题

一、代码逻辑错误修正

你的StreamBuilder存在分支返回逻辑问题:当查询到数据时,你在数据分支里没有返回任何UI组件,最终会走到末尾的return Container(),导致数据无法展示;而如果查询因权限被拒绝返回空快照,就会进入else分支显示“No data found”。

修正后的代码示例:

Container(
  child: StreamBuilder(
    stream: FirebaseFirestore.instance
        .collection("user3")
        .where("id", isEqualTo: FirebaseAuth.instance.currentUser?.uid)
        .snapshots(),
    builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
      // 先判断用户是否登录
      if (FirebaseAuth.instance.currentUser == null) {
        return Text("请先登录");
      }
      // 加载状态
      if (!snapshot.hasData) {
        return Text("Loading please wait........");
      }
      // 有数据时展示UI
      if (snapshot.data!.docs.isNotEmpty) {
        DocumentSnapshot userData = snapshot.data!.docs[0];
        // 替换为你需要展示的用户信息UI
        return Column(
          children: [
            Text("用户ID: ${userData['id']}"),
            Text("用户名: ${userData['name']}"), // 假设文档包含name字段
          ],
        );
      } else {
        return Center(child: Text("No data found"));
      }
    },
  ),
)

二、权限规则排查(核心问题)

既然出现权限相关错误,优先检查Firestore安全规则:

  1. 匹配字段的规则写法:如果user3集合的文档用id字段存储用户uid,规则需写成:
    rules_version = '2';
    service cloud.firestore {
      match /databases/{database}/documents {
        match /user3/{docId} {
          allow read, write: if request.auth != null && request.auth.uid == resource.data.id;
        }
      }
    }
    
  2. 匹配文档ID的规则写法:如果user3集合的文档ID直接等于用户uid,规则更简洁高效:
    rules_version = '2';
    service cloud.firestore {
      match /databases/{database}/documents {
        match /user3/{userId} {
          allow read, write: if request.auth != null && request.auth.uid == userId;
        }
      }
    }
    
  3. 规则测试:在Firebase控制台的「规则模拟器」中,模拟已认证用户的读取请求,输入对应uid,快速验证规则是否允许访问。

三、数据匹配验证

  1. 核对用户uid与文档字段:在代码中打印当前用户uid,对比Firestore中user3集合目标文档的id字段值,确保完全一致(Firestore对大小写、空格敏感):
    print("当前用户UID: ${FirebaseAuth.instance.currentUser?.uid}");
    
  2. 确认文档存在:检查Firestore中是否确实存在对应用户uid的文档,未被误删除或存错集合。

四、额外优化建议

  • 避免强制解包currentUser!,未登录时会触发空指针异常,改用currentUser?.uid并增加登录判断;
  • 如果用文档ID匹配用户uid,直接使用doc(uid)查询比where更高效,还能避免字段匹配错误:
    stream: FirebaseFirestore.instance
        .collection("user3")
        .doc(FirebaseAuth.instance.currentUser?.uid)
        .snapshots(),
    
    对应的builder逻辑需调整为处理DocumentSnapshot而非QuerySnapshot。

内容的提问来源于stack exchange,提问作者Muhammad Zohaib

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 01:01:18