По сути, вы никогда не должны использовать ни один из этих конструкторов.
Каждый из них имеет свое применение, но большинство из этих применений теперь могут быть написаны с использованием литералов списка.
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]
. Если вам нужно повысить, скажем, создать List<num>
из Iterable<int>
, вы можете сделать <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
, а затем всегда предоставлять аргумент типа.
В противном случае используйте литералы списка. Вероятно, это тоже будет более эффективным, поскольку позволяет избежать вызовов некоторых функций.