我正在打电话给Future。在两个Future列表中等待:
Future<void> first() async {
await Future.delayed(Duration(seconds: 1));
print('first');
}
Future<void> second() async {
print('second');
}
void main() async {
final list1 = [0, 1].map((e) => first()).toList();
final list2 = [2, 3].map((e) => second()).toList();
final appended = list1.addAll(list2); // result is not defined
// await Future.wait(appended); // <= error: This expression has a type of 'void' so its value can't be used.
await Future.wait([...list1, ...list2]); // <= this works
}
为什么addAll
不像预期的那样工作?
list1.addAll(list2)
变异list1
。它不返回新的List
,也不返回原来的List
。它什么也不返回,这就是为什么分析器会给您一个错误,认为appended
的类型是void
。不要忽视警告和错误。如果您得到了意想不到的结果,请再次检查文档以验证您的期望。List.addAll
文档显示它有一个void
返回类型,并给出了示例用法。
请注意,当您稍后执行Future.wait([...list1, ...list2])
时,因此您将两次包含list2
中的Future
s(尽管除了稍微降低效率之外,它应该不会影响行为)。
如果你想要一个新的List
,你可以使用List.operator +
:
var appended = list1 + list2;