You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
}

关键修正点说明

  1. 变量名修正:将authUser替换为参数authUserRef,解决未定义变量错误
  2. 查询结果转换:通过ChatsRecord.fromSnapshot方法(自动生成的模型类通常自带该方法)将Firestore返回的QueryDocumentSnapshot转换为业务模型ChatsRecord,解决类型不匹配问题
  3. 空值安全处理:增加输入参数的空值判断,避免传入null导致查询异常
  4. 查询逻辑说明:两次arrayContains条件为逻辑与关系,确保返回的文档users数组同时包含两个指定的DocumentReference,符合需求
  5. 返回类型优化:将返回类型改为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 11:16:01