Por que o construtor List () não está acessível na segurança nula do Dart?

Aug 17 2020

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

5 lrn Aug 18 2020 at 03:30

O Listconstrutor tinha dois usos:

  • new List()para criar uma lista crescente vazia, equivalente a [].
  • new List(n)para criar uma lista de tamanho fixo npreenchida com nullvalores

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 Listconstrutor no futuro, talvez como um alias mais curto para List.filled. Pode-se esperar.