Dart中可选构造参数List为null的原因及最优默认实现
问题解答
1. 为什么未传递参数时myList为null?
这是因为Dart中构造函数的命名可选参数优先级高于类成员的默认初始化。
你在类里声明了List myList = [];,但同时在构造函数里用了{this.myList}——当你调用MyListClass()不传递参数时,这个可选参数的默认值是null,它会直接覆盖类成员变量的初始值[],所以最终obj.myList是null。
2. 传递可选列表但默认设为空列表的最优方式
你现有的实现:
MyListClass({this.myList}) { this.myList ??= []; }
是可行的,但更符合Dart最佳实践的是使用初始化列表来完成默认值赋值,它会在对象实例化的更早阶段执行,比构造函数体里的赋值更高效:
class MyListClass { List myList; MyListClass({List? myList}) : myList = myList ?? []; }
如果开启了null安全(Dart 2.12+),你还可以更清晰地指定类型:
class MyListClass { List<dynamic> myList; MyListClass({List<dynamic>? myList}) : myList = myList ?? []; }
另外,如果你不需要可变列表,也可以直接给参数设置默认的不可变空列表,但注意这种方式创建的列表是const的,不能修改:
class MyListClass { final List myList; MyListClass({this.myList = const []}); }
但如果你的业务场景需要可修改的列表,还是推荐用初始化列表结合??的方式,这是最灵活且高效的方案。
内容的提问来源于stack exchange,提问作者Erlend
相关产品推荐
相关产品推荐

