Flutter如何过滤List<Map<String, dynamic>>,保留completed指定状态项
正确的过滤实现方法
你之前的问题在于误用了map方法——它的作用是转换列表元素,而非筛选元素,而且你没有将操作结果赋值给变量,所以原allData列表完全没被修改。要实现过滤需求,应该使用Dart的where方法,它会筛选出符合条件的元素,最后必须调用toList()将结果转为列表类型。
方法一:直接返回过滤后的列表
在排序完成后,直接根据completed条件过滤并返回结果:
try { String? email = FirebaseAuth.instance.currentUser!.email; for (int i = startingIndex; i < endingIndex; ++i) { var doc = await FirebaseFirestore.instance .collection(email!) .doc("goals") .collection(Utils.goalsCategoriesDropdownItems[i]) .get(); if (doc.size > 0) { allData.addAll(doc.docs.map((doc) => doc.data()).toList()); } } allData.sort(((a, b) { Timestamp one = a["dueDate"]; Timestamp two = b["dueDate"]; return one.compareTo(two); })); // 核心过滤逻辑 List<Map<String, dynamic>> filteredData = allData.where((item) { return item["completed"] == completed; }).toList(); return filteredData; }
方法二:修改原列表后返回
如果需要保留原allData的操作逻辑,也可以直接覆盖原列表后返回:
// 排序后执行过滤 if (completed != null) { // 建议先判断参数是否为空,避免逻辑异常 allData = allData.where((item) => item["completed"] == completed).toList(); } return allData;
额外提示
where方法返回的是惰性迭代器,必须调用toList()才能得到可直接使用的列表对象- 建议对
completed参数做非空判断,避免因参数为空导致的过滤逻辑错误
内容的提问来源于stack exchange,提问作者FlutterBuilder
相关产品推荐
相关产品推荐

