Perché il costruttore List() non è accessibile nella sicurezza nulla di Dart?
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
Il List
costruttore aveva due usi:
new List()
per creare un elenco espandibile vuoto, equivalente a[]
.new List(n)
per creare un elenco di lunghezza fissan
pieno dinull
valori
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 List
costruttore in futuro, forse come alias più breve per List.filled
. Si può sperare.