Por que o construtor List () não está acessível na segurança nula do Dart?
Com NNBD, você não tem permissão para inicializar a lista usando o construtor padrão:
List<int> foo = List(); // Compile time error
No entanto, você ainda pode fazer:
List<int> foo = []; // No error
Então, qual é a diferença entre os dois? Ambos devem mostrar o erro ou nenhum deles.
Respostas
O List
construtor tinha dois usos:
new List()
para criar uma lista crescente vazia, equivalente a[]
.new List(n)
para criar uma lista de tamanho fixon
preenchida comnull
valores
Com segurança nula, o segundo uso era prejudicial na maioria das vezes e não havia uma boa maneira de corrigi-lo. É possível forçar um argumento de tipo a ser não anulável, mas List<T>(4)
só funciona quando T
é anulável . Não há como impor isso.
Portanto, o List(n)
modo necessário foi substituído (substituído por List.filled(n, value)
qual força você a fornecer um valor de preenchimento). Essa esquerda List()
, que realmente não carrega seu próprio peso. Você pode simplesmente usar []
em vez disso (e deveria !), então foi decidido remover o construtor completamente - todos os usos dele eram inseguros ou inúteis. (Além disso, já era um construtor estranho, porque se quiséssemos torná-lo seguro para nulos, ele teria um parâmetro opcional com um tipo não anulável e nenhum valor padrão.)
Ao removê-lo completamente, é possível introduzir um novo List
construtor no futuro, talvez como um alias mais curto para List.filled
. Pode-se esperar.