Firestore Stream获取数据返回空列表,求代码问题排查
Firestore流式获取数据返回空列表问题排查
问题背景
数据库结构:
collection('users').doc().collection('products').doc()
以下代码可成功返回数据:
Stream<List<ProductsModel>> getProductsList(uId) async* { return usersRef.doc(uId).collection('products').snapshots().map( (QuerySnapshot querySnapShot) => querySnapShot.docs .map((DocumentSnapshot documentSnapshot) => ProductsModel.fromDoc(documentSnapshot)) .toList()); }
但采用以下写法时返回空列表:
Stream<List<ProductsModel>> getProductsList(uId) async* { final userData = await usersRef.doc(uId).get(); String masterId = userData.get('masterId'); final event = usersRef .doc(masterId) .collection('products') .snapshots() .map((snapshot) { return snapshot.docs.map((doc) => ProductsModel.fromDoc(doc)).toList(); }); yield* event; }
请问代码存在什么问题?
问题排查与原因分析
返回空列表的核心原因是你实际请求的masterId对应的products集合没有数据,或者无法访问该集合,具体可从以下几点逐一排查:
1. masterId取值错误或不存在
- 检查
userData.get('masterId')的字段名是否正确:比如字段名是否是masterId(大小写、拼写是否和Firestore文档中的字段完全一致)。 - 确认当前
uId对应的用户文档中确实存在masterId字段,且字段值是有效的用户文档ID。可以在获取masterId后添加打印语句验证:String masterId = userData.get('masterId'); print('masterId: $masterId'); // 查看输出是否符合预期
2. masterId对应用户无products集合或集合为空
直接登录Firebase控制台,找到users集合下masterId对应的文档,检查其下的products集合是否存在,且集合内有实际的文档数据。
3. Firestore安全规则限制
第一种写法能成功获取数据,说明当前用户有权访问自己的products集合,但访问其他用户(masterId对应的用户)的products集合可能被安全规则拒绝。Firestore在权限不足时不会抛出错误,而是返回空结果。
- 可临时调整安全规则(仅用于测试),比如允许所有读取操作:
若调整后能返回数据,说明问题出在安全规则,需要修改规则以允许当前用户访问rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /{document=**} { allow read, write: if true; } } }masterId对应的products集合。
4. 数据解析逻辑问题(可能性较低)
检查ProductsModel.fromDoc方法是否能正确解析masterId对应products文档的数据。如果该文档的字段结构和uId对应products文档不一致,可能导致解析失败,生成空列表。但这种情况通常会导致第一种写法也出现问题,所以优先级较低。
内容的提问来源于stack exchange,提问作者Ab Le
相关产品推荐
相关产品推荐

