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

Flutter中LinkedHashMap调用addAll时覆盖旧数据而非追加的原因

问题原因

你对LinkedHashMap的自定义相等逻辑作用存在误解,且没有手动实现分组逻辑,直接调用addAll传入扁平化事件列表,自然会出现同日期数据被覆盖的问题:

  • 你自定义的isSameDay判断和getHashCode方法,仅用于判定两个DateTime键是否为同一个键,不会自动将同键对应的多个值合并为列表。Map的原生逻辑永远是:同键写入时,新值直接覆盖旧值。
  • 你传入addAll的_events是扁平化的单个事件列表,并非DateTime: 事件列表结构的键值对集合。运行时同日期的事件会被判定为对应同一个键,后写入的事件直接覆盖前一个,最终每个日期只会保留最后一条事件数据。
修复方案

你需要先手动遍历事件列表完成按日期分组,再将分组完成的键值对集合传入LinkedHashMap,参考实现如下:

// 原始事件列表
_events = [
  { "name" : "A", "date" : "15 jun" },
  { "name" : "B", "date" : "15 jun" },
  { "name" : "C", "date" : "17 jun" },
  { "name" : "D", "date" : "17 jun" },
];

// 第一步:手动按日期分组
final Map<DateTime, List<dynamic>> tempGroup = {};
for (final event in _events) {
  // 此处替换为你实际的字符串日期转DateTime逻辑,注意要把时分秒毫秒清零避免判定误差
  final dateStr = event['date'].split(' ');
  final monthMap = {'jan':1, 'feb':2, 'mar':3, 'apr':4, 'may':5, 'jun':6, 'jul':7, 'aug':8, 'sep':9, 'oct':10, 'nov':11, 'dec':12};
  final eventDate = DateTime(2024, monthMap[dateStr[1]]!, int.parse(dateStr[0]));
  
  // 键不存在时初始化空列表,再追加当前事件
  tempGroup.putIfAbsent(eventDate, () => []);
  tempGroup[eventDate]!.add(event);
}

// 第二步:将分组好的数据传入自定义LinkedHashMap
kEvents = LinkedHashMap<DateTime, List<dynamic>>(equals: isSameDay, hashCode: getHashCode)
  ..addAll(tempGroup);

// 自定义日期哈希
int getHashCode(DateTime key) {
  return key.day * 1000000 + key.month * 10000 + key.year;
}

运行后查询6月17日对应的键值,就能得到包含C、D两个事件的完整列表。

注:自定义键的相等和哈希逻辑,只用于解决「不同DateTime实例即使代表同一天,默认也不相等」的问题,本身不提供任何自动分组、值合并能力。

内容的提问来源于stack exchange,提问作者icantcode

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 15:18:24