Short answer:
Instead of the pre-null-safety operations
var foo = List<int>(); // Now error
var bar = List<int>(n); // Now error
var baz = List<int>(0); // Now error
use the following:
var foo = <int>[]; // Always the recommended way.
var bar = List.filled(1, 0); // Not filled with `null`s.
var baz = List<int>.empty();
Long answer:
The List
constructor had two uses:
new List()
to create an empty growable list, equivalent to []
.
new List(n)
to create a fixed-length list of length n
filled with null
values
With null safety, the second use was unsound most of the time, and there was no good way to fix it. It's possible to force a type argument to be non-nullable, but List<T>(4)
only works when T
is nullable. There is no way to enforce that.
So, the List(n)
mode needed to go (replaced by List.filled(n, value)
which forces you to provide a fill-value).
That left List()
, which doesn't really carry its own weight. You can just use []
instead (and you should!), so it was decided to remove the constructor entirely - all uses of it was either unsafe or useless.
(Also, it was a weird constructor already, because if we wanted to properly make it null safe, it would have an optional parameter with a non-nullable type and no default value.)
By removing it completely, it makes it possible to, potentially, introduce a new List
constructor in the future, perhaps as a shorter alias for List.filled
. One can hope.