使用默认值初始化类参数



如何用默认值初始化类参数

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 ?? [];
}

相关内容

  • 没有找到相关文章

最新更新