默认 'List' 构造函数在启用 null 安全时不可用。尝试使用列表文字,'List.filled' 或 'List.generate'

The default 'List' constructor isn't available when null safety is enabled. Try using a list literal, 'List.filled' or 'List.generate'

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

// Compile time error: 'List' is deprecated and shouldn't be used.
// The default 'List' constructor isn't available when null safety is enabled. 
// Try using a list literal, 'List.filled' or 'List.generate'.
List<int> foo = List(); 

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

List<int> foo = []; // No error

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

简答:

而不是 pre-null-safety 操作

var foo = List<int>();  // Now error
var bar = List<int>(n); // Now error
var baz = List<int>(0); // Now error

使用以下内容:

var foo = <int>[];           // Always the recommended way.
var bar = List.filled(1, 0); // Not filled with `null`s.
var baz = List<int>.empty();

长答案:

List 构造函数有两个用途:

  • new List() 创建一个空的可增长列表,相当于 [].
  • new List(n) 创建一个 fixed-length 长度 n 的列表,其中填充了 null 个值

null safety的情况下,二次使用大部分时候都是不正常的,也没有很好的办法修复。可以强制类型参数为 non-nullable,但 List<T>(4) 仅在 Tnullable 时有效。没有办法强制执行。

因此,需要退出 List(n) 模式(替换为 List.filled(n, value),这迫使您提供 fill-value)。 剩下 List(),它并没有真正承载自己的重量。您可以只使用 [] 代替(并且您 should!),因此决定完全删除构造函数 - 所有使用它都是不安全或无用的。 (此外,它已经是一个奇怪的构造函数了,因为如果我们想正确地使它成为 null 安全的,它将有一个可选参数,类型为 non-nullable 并且没有默认值。)

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

这是因为默认的 List() 元素已被弃用,您尝试使用如下所示的 List.filled() 元素怎么样

void display() {
    var fixedList = new List<int>.filled(5, 0, growable: false);
    fixedList[0] = 0;
    fixedList[1] = 10;
    fixedList[2] = 20;
    fixedList[3] = 30;
    fixedList[4] = 40;
    print('Elements in the list are as follows: $fixedList');
  }
} 

对于 Growable Length List,您可以尝试如下所示:

void main() {
    var growableList = new List<int>.filled(0,0, growable:true);
    growableList = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90];
    print('The elements in the growable list include: $growableList');
  }

除了先生提到的,您还可以使用以下方法创建列表:

List<int> foo = List<int>.empty(growable: true); // []

_items = List<DropdownMenuItem<String>>(); 可以写成

_items = List<DropdownMenuItem<String>>.from(<DropdownMenuItem<String>>[]);