El constructor predeterminado de 'Lista' no está disponible cuando la seguridad nula está habilitada. Intente utilizar una lista literal, 'List.filled' o 'List.generate'
¿ Por qué List()
no se puede acceder al constructor después de la seguridad nula de Dart?
// Compile time error: 'List' is deprecated and shouldn't be used.
// The default 'List' constructor isn't available when null safety is enabled.
// Try using a list literal, 'List.filled' or 'List.generate'.
List<int> foo = List();
Sin embargo, aún puedes hacer:
List<int> foo = []; // No error
Entonces, ¿cuál es la diferencia entre los dos? O ambos deberían mostrar el error o ninguno de ellos.
Respuesta corta:
En lugar de las operaciones de seguridad previas a la nulidad
var foo = List<int>(); // Now error
var bar = List<int>(n); // Now error
var baz = List<int>(0); // Now error
utilice lo siguiente:
var foo = <int>[]; // Always the recommended way.
var bar = List.filled(1, 0); // Not filled with `null`s.
var baz = List<int>.empty();
Respuesta larga:
El List
constructor tenía dos usos:
new List()
para crear una lista vacía y ampliable, equivalente a[]
.new List(n)
para crear una lista de longitud fijan
llena denull
valores
Con seguridad nula, el segundo uso fue incorrecto la mayor parte del tiempo y no había una buena manera de solucionarlo. Es posible forzar que un argumento de tipo sea no 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)
el que te obliga a proporcionar un valor de relleno). Esa izquierda List()
, que realmente no tiene su propio peso. Puedes usarlo []
en su lugar (¡y deberías hacerlo !), por lo que se decidió eliminar el constructor por completo; todos sus usos eran inseguros o inútiles. (Además, ya era un constructor extraño, porque si quisiéramos hacerlo correctamente seguro contra nulos, tendría un parámetro opcional con un tipo que no acepta valores NULL y sin valor predeterminado).
Al eliminarlo por completo, es posible introducir potencialmente un nuevo List
constructor en el futuro, tal vez como un alias más corto para List.filled
. Se puede tener esperanza.
Aparte de lo que mencionó @lrn señor, también puede crear una lista usando:
List<int> foo = List<int>.empty(growable: true); // []
Esto se debe a que el elemento List() predeterminado quedó obsoleto. ¿Qué tal si intentas usar el elemento List.filled() como se muestra a continuación?
void display() {
var fixedList = new List<int>.filled(5, 0, growable: false);
fixedList[0] = 0;
fixedList[1] = 10;
fixedList[2] = 20;
fixedList[3] = 30;
fixedList[4] = 40;
print('Elements in the list are as follows: $fixedList');
}
}
Mientras que para la Lista de longitudes cultivables puedes intentar hacer lo que se muestra a continuación:
void main() {
var growableList = new List<int>.filled(0,0, growable:true);
growableList = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90];
print('The elements in the growable list include: $growableList');
}