当尝试使用带有胖箭头的短符号更新映射中的字符串列表时,我得到“此表达式的类型为'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]]}
我很乐意留下那样。我只是想知道为什么第一种方法会引发错误。
谢谢。
答案 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'
。