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
相关产品推荐
相关产品推荐

