El constructor predeterminado de 'Lista' no está disponible cuando la seguridad nula está habilitada. Intente utilizar una lista literal, 'List.filled' o 'List.generate'

Resuelto iDecode asked hace 4 años • 4 respuestas

¿ 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.

iDecode avatar Aug 17 '20 20:08 iDecode
Aceptado

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 Listconstructor 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 fija nllena de nullvalores

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

lrn avatar Aug 17 '2020 20:08 lrn

Aparte de lo que mencionó @lrn señor, también puede crear una lista usando:

List<int> foo = List<int>.empty(growable: true); // []
iDecode avatar Sep 06 '2021 00:09 iDecode

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');
  }
Lamech Desai avatar May 11 '2021 13:05 Lamech Desai