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安全规则:
- 匹配字段的规则写法:如果
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; } } } - 匹配文档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; } } } - 规则测试:在Firebase控制台的「规则模拟器」中,模拟已认证用户的读取请求,输入对应uid,快速验证规则是否允许访问。
三、数据匹配验证
- 核对用户uid与文档字段:在代码中打印当前用户uid,对比Firestore中
user3集合目标文档的id字段值,确保完全一致(Firestore对大小写、空格敏感):print("当前用户UID: ${FirebaseAuth.instance.currentUser?.uid}"); - 确认文档存在:检查Firestore中是否确实存在对应用户uid的文档,未被误删除或存错集合。
四、额外优化建议
- 避免强制解包
currentUser!,未登录时会触发空指针异常,改用currentUser?.uid并增加登录判断; - 如果用文档ID匹配用户uid,直接使用
doc(uid)查询比where更高效,还能避免字段匹配错误:
对应的builder逻辑需调整为处理stream: FirebaseFirestore.instance .collection("user3") .doc(FirebaseAuth.instance.currentUser?.uid) .snapshots(),DocumentSnapshot而非QuerySnapshot。
内容的提问来源于stack exchange,提问作者Muhammad Zohaib
相关产品推荐
相关产品推荐

