如何用默认值初始化类参数
void main() {
Test t = Test();
print(t.l); //<-prints null, should print []
}
class Test{
List l=[];
Test({this.l});
}
我认为这以前对我有效,但由于某种原因,现在不起作用
void main() {
Test t = Test();
print(t.l);
}
class Test{
List l;
Test({this.l}) : l = l ?? []; //<- as from GitHub this doesn't work either
}
如果您想采用参数,或者在省略参数时使用默认值,那么您需要使用类似第二个示例的东西:
class MyListClass {
final List myList;
MyListClass({List myList}) : myList = myList ?? [];
}
(注意,它在构造函数参数列表中不是this.myList
,因为它是由初始化器列表项初始化的(。
如果默认值是编译时常数,则可以将其用作实际的参数默认值:
class MyListClass {
final List myList;
MyListClass({this.myList = const []});
}
只有当默认值为常量时,这种方法才有效,而且它仍然有可能(直到发布Null Safety(有人将null
作为显式参数传递。第一个例子用[]
替换null
,无论null
是来自于省略参数还是明确传递null
。
(我倾向于选择前一种方法,即使默认值是常量,因为它处理显式的Null。有了Null安全性,这将不再是必要的(。
正如VyacheslavEgorov所评论的,如果你不想要常量默认值,最好的方法是通过初始化器
当你从github中删除构造函数时,它工作的原因是:
当你写f({this.x}(时,意味着f({this.x:null}(。
默认初始值设定项只能是常量,因此您的最佳选择是f({List x}(:x=x??[];
所以它会是这样的:
class MyListClass {
List myList;
MyListClass({List myList}) : this.myList = myList ?? [];
}