flutter dart :Map中的列表:返回类型“void”不是< OverlapParams>闭包上下文所要求的“List”

m1m5dgzv  于 2023-05-19  发布在  Flutter
关注(0)|答案(2)|浏览(212)

我正在创建一个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.

我不明白在这种情况下,虚空意味着什么?

pwuypxnk

pwuypxnk1#

update方法的第二个参数是V update(V value)
那用英语是什么意思?一种方法,它接收类型为V * 的参数并返回类型为V* 的示例。
现在让我们看看你传递的参数是什么:

(existingValue) => (existingValue as List<OverlapParams>).add(overlapitem),

这显然是一种方法。它显然得到一个参数。它返回的是什么?第一眼什么都没有。再看一下,由于没有显式返回,它返回表达式(existingValue as List<OverlapParams>).add(overlapitem)的结果。结果是void,因为这是add返回的结果。
这就是为什么你的编译器会抱怨:你的函数没有返回它应该返回的东西。
你可以 * 显式地 * 返回一些东西:

(existingValue) => { 
  (existingValue as List<OverlapParams>).add(overlapitem); 
  return existingValue; 
}

如果出于某种原因,你想要一个 new list来替换旧的列表(这就是update方法的目的),你可以从匿名函数返回一个新的列表:

(existingValue) => [overlapitem,...existingValue],

我已经删除了as部分,这不应该是必要的,因为你的V类型已经定义为List<OverlapParams>

omqzjyyz

omqzjyyz2#

您需要在map.update函数中返回一个值。add(value)不返回任何内容
试试这个

map.update(
pos,
(existingValue)  {
  (existingValue as List<OverlapParams>).add(overlapitem);
  return existingValue;
},
ifAbsent: () => [overlapitem],
);

我还没有测试过,但是如果现有值是不可变的,那么试试这个

map.update(
pos,
(existingValue)  {
  var oldList = (existingValue as List<OverlapParams>);
  oldList.add(overlapitem);
  return oldList;
},
ifAbsent: () => [overlapitem],
);

相关问题