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

Flutter中HashMap<String, List<CustomObject>>添加元素时覆盖List问题

问题根因

你为所有新增Key赋值时都复用了同一个全局tmpList实例,不同Key指向的是内存地址完全相同的List对象。后续不管修改哪个Key对应的List,本质都是修改同一个List,自然所有Key查询返回的内容完全一致。

修复步骤
  • 删除冗余的内层判断逻辑:外层已经通过ElementJobMap.containsKey(Key)做了存在性校验,内层if (Key == _JobsList[i].elementID.toString())属于完全重复的无效判断,可以直接移除
  • 新增Key时创建独立的List实例:不要直接复用全局的tmpList,改为每次创建新的List对象。如果需要保留tmpList的初始内容,使用List.from做拷贝,不需要初始内容直接创建空List即可。
修复后代码
HashMap<String, List<Jobs>> ElementJobMap = HashMap<String, List<Jobs>>();

for (int i = 0; i < _JobsList.length; i++) {
  String key = _JobsList[i].elementID.toString();
  if (ElementJobMap.containsKey(key)) {
    ElementJobMap.update(key, (value) {
      value.add(_JobsList[i]);
      return value;
    });
  } else {
    // 不需要初始值直接写 <Jobs>[] 即可
    // 需要复用tmpList初始值就写 List<Jobs>.from(tmpList)
    ElementJobMap[key] = <Jobs>[]..add(_JobsList[i]);
  }
}
更简洁的优化写法

可以直接用putIfAbsent简化判断逻辑,代码更精简:

HashMap<String, List<Jobs>> ElementJobMap = HashMap<String, List<Jobs>>();

for (var job in _JobsList) {
  String key = job.elementID.toString();
  ElementJobMap.putIfAbsent(key, () => <Jobs>[]).add(job);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 20:24:04