默认 '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)
仅在 T
为 nullable 时有效。没有办法强制执行。
因此,需要退出 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>>[]);
为什么 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)
仅在 T
为 nullable 时有效。没有办法强制执行。
因此,需要退出 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>>[]);