Flutter中如何按Firestore文档内Map列表指定值筛选获取对应文档
实现方案
你可以通过展开嵌套数组→条件过滤→实体转换三步完成需求,具体代码如下:
首先你需要提前拿到当前登录的译员用户名,示例中我们用currentTranslatorName变量存储,你可以替换成自己项目中从登录状态/ Firebase Auth 读取的对应值。
在你获取到全量documents的位置替换为以下逻辑:
// 替换为你自己项目中获取当前登录译员用户名的逻辑 final String currentTranslatorName = '当前登录的用户名'; // 1. 展开多层嵌套的预约数组为一维Map列表 final allApptMaps = documents.expand((apptList) => apptList as List<Map<String, dynamic>>).toList(); // 2. 筛选translator字段匹配当前用户的预约 final filteredApptMaps = allApptMaps.where((appt) => appt['translator'] == currentTranslatorName).toList(); // 3. 转换为你定义的Appointment实体类 final List<Appointment> myAppointments = filteredApptMaps.map((map) { return Appointment( date: map['date'], hospital: map['hospital'], translator: map['translator'], translatorPhone: map['translatorPhone'], driver: map['driver'], driverPhone: map['driverPhone'], description: map['description'], doctor: map['doctor'], procedure: map['procedure'], ); }).toList();
处理完成后得到的myAppointments就是你需要的当前译员的预约列表,直接用它渲染UI即可。
可选优化
如果后续你的预约数据量变大,全量拉取客户端筛选会浪费带宽,你可以调整Firestore的存储结构:把每条预约作为独立文档存储,直接在查询阶段通过where('translator', isEqualTo: currentTranslatorName)过滤,服务端直接返回目标数据,性能更好。
内容的提问来源于stack exchange,提问作者Njm Jeb
相关产品推荐
相关产品推荐

