使用Dart查询Firestore文档报错,寻求解决方案
问题解决与代码修正
一、编译错误修复
1. 替换documents为docs
cloud_firestore 4.x及以上版本中,QuerySnapshot的文档列表属性已从documents更名为docs,直接替换即可:
for (DocumentSnapshot doc in queryDocuments.docs) { // ... }
2. 修正doc.data与ChatsRecord实例化问题
DocumentSnapshot的data现在是方法,需改为doc.data()- 若
ChatsRecord是自定义模型类,需确保存在fromMap静态方法;如果是自动生成的类,可能方法名是fromDocumentSnapshot,也可以手动实现fromMap:
示例实现ChatsRecord的fromMap方法:
class ChatsRecord { final List<DocumentReference> users; // 其他业务字段... ChatsRecord({required this.users}); static ChatsRecord fromMap(Map<String, dynamic> data) { return ChatsRecord( users: List<DocumentReference>.from(data['users']), // 初始化其他字段 ); } }
修正后的实例化代码:
ChatsRecord chatDoc = ChatsRecord.fromMap(doc.data() as Map<String, dynamic>);
二、修正查询逻辑(顺序无关匹配两个元素)
当前使用isEqualTo匹配数组会严格要求元素顺序一致,要实现顺序无关、同时包含两个指定DocumentReference的查询,需组合两个arrayContains条件:
final filteredDocuments = collectionRef .where('users', arrayContains: authUserRef) .where('users', arrayContains: chatUserRef);
该查询会返回所有users数组中同时包含两个指定DocumentReference的文档,不受元素顺序影响。
完整修正后的代码
import 'package:cloud_firestore/cloud_firestore.dart'; Future<List<ChatsRecord>> getChatDoc(DocumentReference chatUserRef, DocumentReference authUserRef) async { final firestore = FirebaseFirestore.instance; final collectionRef = firestore.collection('chats'); // 顺序无关匹配两个元素的查询 final filteredDocuments = collectionRef .where('users', arrayContains: authUserRef) .where('users', arrayContains: chatUserRef); final queryDocuments = await filteredDocuments.get(); List<ChatsRecord> listChatDocs = []; for (DocumentSnapshot doc in queryDocuments.docs) { final data = doc.data() as Map<String, dynamic>; ChatsRecord chatDoc = ChatsRecord.fromMap(data); listChatDocs.add(chatDoc); } return listChatDocs; } // 自定义ChatsRecord模型类示例 class ChatsRecord { final List<DocumentReference> users; // 添加业务所需其他字段 ChatsRecord({required this.users}); static ChatsRecord fromMap(Map<String, dynamic> data) { return ChatsRecord( users: List<DocumentReference>.from(data['users'] ?? []), // 初始化其他字段 ); } }
内容的提问来源于stack exchange,提问作者satchel
相关产品推荐
相关产品推荐

