¿Por qué el constructor List() no es accesible en la seguridad nula de Dart?

Aug 17 2020

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

5 lrn Aug 18 2020 at 03:30

El Listconstructor tenía dos usos:

  • new List()para crear una lista ampliable vacía, equivalente a [].
  • new List(n)para crear una lista de longitud fija nllena de nullvalores

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 Tes 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 Listconstructor en el futuro, tal vez como un alias más corto para List.filled. Uno puede esperar.