Flutter(Dart)对接Firebase:按日期排序+按类型分组查询求助
解决方案:按日期筛选+按用户ID分组数据
你的Firebase日期范围查询逻辑已经没问题,先补上需要的statusLabel筛选条件,再用Dart的Map实现可靠的分组逻辑,就能满足PDF生成的数据格式需求。
第一步:完善Firestore查询
先打开statusLabel的筛选条件,确保只获取目标状态的数据:
Future<List<JobsData>> getEntry({DateTime? from, DateTime? to}) async { try { QuerySnapshot<Map<String, dynamic>> _snap = await _firestore .collection("applications") .where("dateOfApplication", isGreaterThanOrEqualTo: from?.toIso8601String()) .where("dateOfApplication", isLessThanOrEqualTo: to?.toIso8601String()) .where("statusLabel", isEqualTo: "Finalized") // 启用状态筛选 .orderBy("dateOfApplication") .get(); return _snap.docs.map((e) => JobsData.fromJson(e.data())).toList(); } on FirebaseException catch (e) { throw e; } }
第二步:实现分组逻辑
获取到jobsData后,用Map<String, List<JobsData>>按userApliedId分组,因为查询已经按日期排序,分组后每组内的数据会保持日期顺序:
// 假设已获取到jobsData列表 Map<String, List<JobsData>> groupedJobs = {}; for (var job in jobsData) { // 若当前用户ID无对应分组,创建空列表 groupedJobs.putIfAbsent(job.userApliedId, () => []); // 将当前job加入对应分组 groupedJobs[job.userApliedId]!.add(job); }
更简洁的写法可以用fold方法:
Map<String, List<JobsData>> groupedJobs = jobsData.fold({}, (map, job) { map[job.userApliedId] = [...map[job.userApliedId] ?? [], job]; return map; });
第三步:转换为PDF所需格式
把分组后的数据转换成二维数组格式,适配PDF排版需求:
// 最终用于PDF的数据集 List<List<dynamic>> pdfData = []; // 遍历每个分组 groupedJobs.forEach((userId, jobs) { // 可添加分组标题(根据PDF格式需求调整) pdfData.add(["用户ID: $userId"]); // 将每个job转换为指定字段数组 for (var job in jobs) { pdfData.add([ job.imageUrl, userId, job.date, job.Actividad, job.customer, job.pago, job.statusLabel, job.jober, job.imageUrl.toString().split(" ").first, ]); } // 添加分隔行,优化PDF排版 pdfData.add(["---"]); }); // 打印验证结果 print(pdfData);
原有代码的问题说明
你之前的循环逻辑存在几个无效点:
sorted = jobsData是引用赋值,排序会直接修改原列表sorted[i].userApliedId == sorted[i].userApliedId是恒成立的无效判断- 每次循环都重新生成全量
datas列表,没有实现真正的分组逻辑
用Map分组的方式可以清晰将同一userApliedId的任务归类,完全匹配你PDF生成的数据要求。
内容的提问来源于stack exchange,提问作者Kevin García
相关产品推荐
相关产品推荐

