Flutter-Firestore复合查询无结果问题求助
问题排查与修复
你的代码核心问题出在获取查询快照的语句上,错误地重置了查询路径,导致实际查询的不是你预期的用户子集合。
错误原因分析
你之前已经正确构建了基于Users/{uid}/allTasks的复合查询nameValorQuery,但最后一行:
final snapshot = await nameValorQuery.firestore.collection('allTasks').get();
这里的nameValorQuery.firestore会返回Firestore的根实例,随后调用collection('allTasks')相当于直接查询根目录下的allTasks集合,而非当前用户UID对应的子集合,自然找不到匹配数据。
修正后的代码
把获取快照的语句替换为直接调用nameValorQuery.get()即可:
Future myQuery () async{ final currentQuery = FirebaseFirestore.instance .collection('Users') .doc(FirebaseAuth.instance.currentUser!.uid) .collection('allTasks'); Query nameQuery = currentQuery.where('status', isEqualTo: 'Inbox'); Query nameValorQuery = nameQuery.where('important', isEqualTo: 'False'); // 直接使用构建好的查询获取快照 final snapshot = await nameValorQuery.get(); if (snapshot.docs.isNotEmpty) { print(snapshot.docs.first); } else { print(snapshot.docs.length); print('No data available.'); } }
额外检查项
如果修正后仍无数据,建议排查以下几点:
- Firestore安全规则:确认规则允许当前用户访问
Users/{uid}/allTasks路径下的文档,比如是否配置了类似规则:match /Users/{userId}/allTasks/{taskId} { allow read, write: if request.auth != null && request.auth.uid == userId; } - 字段值类型匹配:检查数据库中
important字段的类型,如果是布尔类型(false),而你代码里查询的是字符串'False',会导致不匹配,需改为isEqualTo: false - 字段名大小写:确认数据库中的字段名(如
status、important)和代码中的拼写、大小写完全一致 - 当前用户UID正确性:可以先打印
FirebaseAuth.instance.currentUser!.uid,确认是否和数据库中存在的用户UID一致
内容的提问来源于stack exchange,提问作者Laurent Thomas
相关产品推荐
相关产品推荐

