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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 03:01:02