Почему конструктор List () недоступен в нулевой безопасности Dart?
С NNBD вам не разрешено инициализировать список с помощью конструктора по умолчанию:
List<int> foo = List(); // Compile time error
Однако вы все равно можете:
List<int> foo = []; // No error
Итак, в чем разница между ними? Либо оба из них должны показывать ошибку, либо ни одна из них.
Ответы
ListКонструктор имел два применения:
new List()для создания пустого расширяемого списка, эквивалентного[].new List(n)для создания списка фиксированной длины,nзаполненногоnullзначениями
При нулевой безопасности второе использование в большинстве случаев было ненадежным, и не было хорошего способа исправить это. Можно заставить аргумент типа быть ненулевыми, но List<T>(4)работает только тогда , когда Tэто обнуляемое . Невозможно добиться этого.
Итак, List(n)режим, который нужно было запустить (заменен на List.filled(n, value)который заставляет вас указать значение заполнения). Это левое List(), что на самом деле не имеет собственного веса. []Вместо этого вы можете просто использовать (и должны !), Поэтому было решено полностью удалить конструктор - все его использования были либо небезопасными, либо бесполезными. (Кроме того, это уже был странный конструктор, потому что, если бы мы хотели правильно сделать его нулевым безопасным, у него был бы необязательный параметр с типом, не допускающим значения NULL, и без значения по умолчанию.)
Полностью удалив его, можно потенциально ввести новый Listконструктор в будущем, возможно, в качестве более короткого псевдонима для List.filled. Можно надеяться.