Flutter Firebase查询users数组同时包含双用户引用的文档及报错
问题解决:Firestore查询数组同时包含两个DocumentReference的文档
错误分析
原代码存在以下问题:
- 变量名错误:使用了未定义的
authUser,应为参数authUserRef - 未正确处理查询结果:直接将
QuerySnapshot赋值给ChatsRecord,未完成类型转换 - 缺少空值处理:未判断输入参数是否为空,可能导致无效查询
- 返回类型不匹配:未将
QueryDocumentSnapshot转换为ChatsRecord类型,引发编译类型错误
修正后的代码
import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:counter_party/backend/schema/chats_record.dart'; Future<ChatsRecord?> getChatDocFromChatUserAuthUser( DocumentReference? chatUserRef, DocumentReference? authUserRef, ) async { // 空参数判断,避免无效查询 if (chatUserRef == null || authUserRef == null) { return null; } final querySnapshot = await FirebaseFirestore.instance .collection('chats') .where("users", arrayContains: chatUserRef) .where("users", arrayContains: authUserRef) .get(); // 转换第一个匹配的文档为ChatsRecord if (querySnapshot.docs.isNotEmpty) { return ChatsRecord.fromSnapshot(querySnapshot.docs.first); } // 无匹配文档时返回null return null; }
关键修正点说明
- 变量名修正:将
authUser替换为参数authUserRef,解决未定义变量错误 - 查询结果转换:通过
ChatsRecord.fromSnapshot方法(自动生成的模型类通常自带该方法)将Firestore返回的QueryDocumentSnapshot转换为业务模型ChatsRecord,解决类型不匹配问题 - 空值安全处理:增加输入参数的空值判断,避免传入null导致查询异常
- 查询逻辑说明:两次
arrayContains条件为逻辑与关系,确保返回的文档users数组同时包含两个指定的DocumentReference,符合需求 - 返回类型优化:将返回类型改为
Future<ChatsRecord?>,明确表示可能无匹配文档的情况;若需要返回所有匹配结果,可改为Future<List<ChatsRecord>>,对应代码如下:
Future<List<ChatsRecord>> getChatDocsFromChatUserAuthUser( DocumentReference? chatUserRef, DocumentReference? authUserRef, ) async { if (chatUserRef == null || authUserRef == null) { return []; } final querySnapshot = await FirebaseFirestore.instance .collection('chats') .where("users", arrayContains: chatUserRef) .where("users", arrayContains: authUserRef) .get(); return querySnapshot.docs.map((doc) => ChatsRecord.fromSnapshot(doc)).toList(); }
内容的提问来源于stack exchange,提问作者satchel
相关产品推荐
相关产品推荐

