“列表”已弃用,不应使用 - Dart null 安全

iDe*_*ode 17 dart dart-null-safety

为什么在 Dart 的 null 安全之后无法访问 List() 构造函数?

// Compile time error: 'List' is deprecated and shouldn't be used.
List<int> foo = List(); 
Run Code Online (Sandbox Code Playgroud)

但是,您仍然可以这样做:

List<int> foo = []; // No error
Run Code Online (Sandbox Code Playgroud)

那么,两者有什么区别呢?他们都应该显示错误或不显示错误。

lrn*_*lrn 35

简短的回答:

而不是使用

List<int> foo = List(); // Error
Run Code Online (Sandbox Code Playgroud)

使用以下任何一种:

List<int> foo = List(); // Error
Run Code Online (Sandbox Code Playgroud)

长答案:

List构造函数有两个用途:

  • new List()创建一个空的可增长列表,相当于[].
  • new List(n)创建一个nnull值填充的固定长度列表

使用 null 安全,第二次使用在大多数情况下是不可靠的,并且没有好的方法来修复它。可以强制类型参数不可为空,但List<T>(4)仅在T时才有效。没有办法强制执行。

因此,List(n)需要采用的模式(由List.filled(n, value)强制您提供填充值的模式代替)。剩下的List(),它并没有真正承载自己的重量。您可以[]改为使用(您应该使用!),因此决定完全删除构造函数 - 它的所有用途要么不安全,要么无用。(此外,它已经是一个奇怪的构造函数,因为如果我们想正确地使其为空安全,它将有一个可选参数,该参数具有不可为空的类型且没有默认值。)

通过完全删除它,List将来有可能引入一个新的构造函数,也许作为List.filled. 一个人可以希望。


iDe*_*ode 10

除了@lrn先生提到的之外,您还可以使用以下命令创建列表:

List<int> foo = List<int>.empty(growable: true); // []
Run Code Online (Sandbox Code Playgroud)