如何使用默认值初始化类参数
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
}
答案 0 :(得分:1)
如果要 接受参数或在省略参数时使用默认值,则需要使用类似第二个示例的内容:
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 Safety,就不再需要此方法。)
答案 1 :(得分:0)
VyacheslavEgorov所说的最好方法是通过初始化程序,如果您不希望使用const默认值
根据从github上的this问题来看,删除构造函数时它起作用的原因是:
写f({this.x})意味着f({this.x:null})。
默认初始值设定项只能是常量,因此最好的选择是 f({List x}):x = x ?? [];
所以会是这样:
class MyListClass {
List myList;
MyListClass({List myList}) : this.myList = myList ?? [];
}