这可能是Dart错误吗?

时间:2019-05-02 11:03:01

标签: dart

当尝试使用带有胖箭头的短符号更新映射中的字符串列表时,我得到“此表达式的类型为'void',不能使用。”错误。如果我不使用缩写符号,而是使用中间变量并将其返回,则可以正常工作。

我正在尝试更新以下类型的地图:

Map<String, List<List<String>>> mapWithAListOfListsOfStrings = {};

这是使用粗箭头符号的代码。

void main() {
  Map<String, List<List<String>>> mapWithAListOfListsOfStrings = {};
  String string1 = 'Lorem ipsum dolor sit amet';
  String string2 = 'consectetur adipiscing elit';

  for (String string in [string1, string2]) {
    List<String> splitString = string.split(' ');
    mapWithAListOfListsOfStrings.update('1', (list) => list.add(splitString), ifAbsent: () => [splitString]);
  }

  print("Map contains: ${mapWithAListOfListsOfStrings.toString()}");

}

这是我得到的错误:

sample.dart:8:56: Error: This expression has type 'void' and can't be used.
    mapWithAListOfListsOfStrings.update('1', (list) => list.add(splitString), ifAbsent: () => [splitString]);

这是我可行的解决方法:

void main() {
  Map<String, List<List<String>>> mapWithAListOfListsOfStrings = {};
  String string1 = 'Lorem ipsum dolor sit amet';
  String string2 = 'consectetur adipiscing elit';

  for (String string in [string1, string2]) {
    List<String> splitString = string.split(' ');
    mapWithAListOfListsOfStrings.update('1', (list) {
      List<List<String>> returnList = list;
      returnList.add(splitString);
      return returnList;
    }, ifAbsent: () => [splitString]);
  }

  print("Map contains: ${mapWithAListOfListsOfStrings.toString()}");

}

这是预期的结果:

地图包含:{1:[[Lorem,ipsum,dolor,sit,amet],[consectetur,adipiscing,elit]]}

我很乐意留下那样。我只是想知道为什么第一种方法会引发错误。

谢谢。

1 个答案:

答案 0 :(得分:1)

问题确实是list.add的返回类型是无效的,而不是列表本身。 update方法要求其参数函数返回提供的键的新值,而=> list.add(...)则不这样做,它仅返回void。

您的解决方法可以简化为:

(list) {
  list.add(splitString);
  return list;
}

或:

(list) => list..add(splitString)

,但是真正的问题是您根本不应该使用map.update。该功能旨在替换键的现有值,而不是在向其添加内容后保留列表值。您必须竭尽所能再次返回值,而不是仅使用不会更改键值的函数(除非它不在此处)。

我将其写为:

mapWithAListOfListOfStrings.putIfAbsent('1', () =>[]).add(splitString);

putIfAbsent返回现有值,如果还没有值,则插入一个值,然后返回该值,因此确实如此:

  • 确保我的map['1'] exists和是一个列表
  • 执行map['1'].add(splitString)

它只是这样做,而无需两次查询'1'