我正在创建一个Map,其中包含:
Map<int,List<OverlapParams>> map = new Map<int,List<OverlapParams>>();
我想将元素upsert到Map中,就像当Map键2不存在时,我想在那里保存一个List<OverlapParams>
。- 如果Map键存在,我想将项目overlapitem
添加到map中的List中。
下面是我的代码:
final overlapitem = OverlapParams(childParentData.hashCode.toString(), DateTimeRange(
start: childParentData.startDateTime ?? DateTime(2000),
end: childParentData.endDateTime ?? DateTime(2000),
), {});
int pos = childParentData.position ?? 0;
map.update(
pos,
(existingValue) => (existingValue as List<OverlapParams>).add(overlapitem),
ifAbsent: () => [overlapitem],
);
但是我得到了下面的错误与下划线(existingValue as List<OverlapParams>).add(overlapitem)
:
error: The return type 'void' isn't a 'List<OverlapParams>', as required by the closure's context.
我不明白在这种情况下,虚空意味着什么?
2条答案
按热度按时间pwuypxnk1#
update
方法的第二个参数是V update(V value)
。那用英语是什么意思?一种方法,它接收类型为V * 的参数并返回类型为V* 的示例。
现在让我们看看你传递的参数是什么:
这显然是一种方法。它显然得到一个参数。它返回的是什么?第一眼什么都没有。再看一下,由于没有显式返回,它返回表达式
(existingValue as List<OverlapParams>).add(overlapitem)
的结果。结果是void
,因为这是add
返回的结果。这就是为什么你的编译器会抱怨:你的函数没有返回它应该返回的东西。
你可以 * 显式地 * 返回一些东西:
如果出于某种原因,你想要一个 new list来替换旧的列表(这就是update方法的目的),你可以从匿名函数返回一个新的列表:
我已经删除了
as
部分,这不应该是必要的,因为你的V
类型已经定义为List<OverlapParams>
。omqzjyyz2#
您需要在map.update函数中返回一个值。add(value)不返回任何内容
试试这个
我还没有测试过,但是如果现有值是不可变的,那么试试这个