Perché il costruttore List() non è accessibile nella sicurezza nulla di Dart?

Aug 17 2020

Con NNBD, non è consentito inizializzare l'elenco utilizzando il costruttore predefinito:

List<int> foo = List(); // Compile time error

Tuttavia, puoi ancora fare:

List<int> foo = []; // No error

Quindi, qual è la differenza tra i due? Entrambi dovrebbero mostrare l'errore o nessuno di essi.

Risposte

5 lrn Aug 18 2020 at 03:30

Il Listcostruttore aveva due usi:

  • new List()per creare un elenco espandibile vuoto, equivalente a [].
  • new List(n)per creare un elenco di lunghezza fissa npieno di nullvalori

Con la sicurezza nulla, il secondo utilizzo non era corretto per la maggior parte del tempo e non c'era un buon modo per risolverlo. È possibile forzare un argomento di tipo a non annullare l'annullamento, ma List<T>(4)funziona solo quando Tè nullable . Non c'è modo di imporlo.

Quindi, la List(n)modalità necessaria per andare (sostituita da List.filled(n, value)which ti costringe a fornire un valore di riempimento). Quella sinistra List(), che in realtà non ha il suo peso. Puoi semplicemente usare []invece (e dovresti !), quindi è stato deciso di rimuovere completamente il costruttore: tutti i suoi usi erano pericolosi o inutili. (Inoltre, era già un costruttore strano, perché se volessimo renderlo correttamente null safe, avrebbe un parametro facoltativo con un tipo non annullabile e nessun valore predefinito.)

Rimuovendolo completamente, rende possibile, potenzialmente, introdurre un nuovo Listcostruttore in futuro, forse come alias più breve per List.filled. Si può sperare.