Dart中Map嵌套List更新报错:void不符合List<OverlapParams>要求
解决Map<int, List>的Upsert逻辑报错问题
错误里的void是什么意思?
void是Dart的类型标记,代表这个方法执行后没有任何返回值。具体到List.add()方法,它只负责把元素追加到列表里,执行完后不会返回任何数据——既不会返回修改后的列表,也不会返回其他值。
你报错的核心原因是:你在使用Map的update方法时,传入的闭包要求必须返回一个List<OverlapParams>类型的值,但你直接把add()的执行结果(也就是void)当成了返回值,导致类型不匹配。
正确的Upsert实现代码
方法1:用update + putIfAbsent(简洁推荐写法)
Map<int, List<OverlapParams>> myMap = {}; OverlapParams overlapItem = OverlapParams(); // 你的OverlapParams实例 int targetKey = 1; // 目标键 myMap.update( targetKey, // 键存在时:先添加元素,再返回原列表(满足闭包返回List的要求) (existingList) { existingList.add(overlapItem); return existingList; }, // 键不存在时:创建包含当前元素的新列表存入 ifAbsent: () => [overlapItem], );
方法2:直接判断键是否存在(更直观的写法)
如果觉得闭包写法容易混淆,也可以用基础的条件判断:
Map<int, List<OverlapParams>> myMap = {}; OverlapParams overlapItem = OverlapParams(); int targetKey = 1; if (myMap.containsKey(targetKey)) { myMap[targetKey]!.add(overlapItem); } else { myMap[targetKey] = [overlapItem]; }
关键注意点
- 不要把
List.add()作为需要返回值的闭包结果,因为它没有返回值(void) - 使用
Map.update时,更新逻辑的闭包必须返回对应类型的value(这里就是List<OverlapParams>)
内容的提问来源于stack exchange,提问作者Lukas Fürst
相关产品推荐
相关产品推荐

