基本上,您不应该使用任何这些构造函数。
每个都有它的用途,但现在大多数用途都可以使用列表文字来编写。
List.generate 对应于 List.filled。后者在每个槽中创建一个填充相同值的列表,前者允许您为每个槽计算一个新值。
使用 collection-for,我可能会写:
var newList = [for (var i = 0; i < 10; i++) compute(i)];
而不是
var newList = List.generate(10, compute);
(如果我可以内联 compute 函数就更是如此)。
generate 有意义的一种情况是创建一个固定长度的列表。文字无法做到这一点。
我还要说你应该永远使用List.of(something)。
请改用something.toList() 或[...something]。如果你需要向上转换,比如从Iterable<int> 创建一个List<num>,你可以使用<num>[...something],但你不能使用toList。如果你需要定长List<num>,...那么我认为List<num>.of(something, growable: false)实际上是最简单的解决方案。
使用List.from 的唯一原因是原始可迭代对象没有所需的严格类型。如果您知道您的Iterable<num> 只包含整数,您可能想要做List<int>.from(iterable)。您也可以使用iterable.cast<int>().toList() 或[for (var v in iterable) v as int],但List.from 可以更短。 总是向List.from提供一个类型变量。
所以,一般来说:如果您需要一个固定长度的列表(传递growable: false),或者如果您想使用List.from 向下转换元素,则只使用这些构造函数之一,然后始终提供类型论据。
否则使用列表文字。这可能也会更有效,因为它避免了一些函数调用。