¿Por qué el constructor List() no es accesible en la seguridad nula de Dart?
Con NNBD, no puede inicializar la lista usando el constructor predeterminado:
List<int> foo = List(); // Compile time error
Sin embargo, todavía puedes hacer:
List<int> foo = []; // No error
Entonces, ¿cuál es la diferencia entre los dos? Ambos deben mostrar el error o ninguno de ellos.
Respuestas
El List
constructor tenía dos usos:
new List()
para crear una lista ampliable vacía, equivalente a[]
.new List(n)
para crear una lista de longitud fijan
llena denull
valores
Con seguridad nula, el segundo uso fue defectuoso la mayor parte del tiempo y no había una buena manera de solucionarlo. Es posible forzar un argumento de tipo para que no sea anulable, pero List<T>(4)
solo funciona cuando T
es anulable . No hay manera de hacer cumplir eso.
Entonces, el List(n)
modo necesitaba ir (reemplazado por List.filled(n, value)
lo que te obliga a proporcionar un valor de relleno). Esa izquierda List()
, que en realidad no tiene su propio peso. Simplemente puede usar en su []
lugar (¡y debería hacerlo !), por lo que se decidió eliminar el constructor por completo: todos los usos eran inseguros o inútiles. (Además, ya era un constructor extraño, porque si quisiéramos convertirlo en seguro nulo correctamente, tendría un parámetro opcional con un tipo no anulable y sin valor predeterminado).
Al eliminarlo por completo, hace posible, potencialmente, introducir un nuevo List
constructor en el futuro, tal vez como un alias más corto para List.filled
. Uno puede esperar.