Dart中如何用非常量默认初始化器初始化类的非空成员?
让非空成员变量拥有默认初始化值的几种方法
你遇到的问题是因为在初始化列表中直接对非空成员变量使用??=操作符不合法——此时成员变量还未完成初始化,无法执行这类赋值操作。下面提供几种更优的方案,既能保持成员变量非空,又能实现默认值初始化:
方法一:利用初始化列表结合可空参数
这是最推荐的方式,通过构造函数的可空可选参数,在初始化列表中完成非空成员变量的赋值:
class Foo2 { DateTime date; // 参数设为可空可选,初始化列表中用 ?? 运算符指定默认值 Foo2({DateTime? date}) : date = date ?? DateTime.now(); }
这里构造函数接收一个可空的可选命名参数date,如果调用时未传入该参数,就用DateTime.now()作为默认值直接初始化非空的成员变量date,整个过程在实例创建阶段完成,安全且高效。
方法二:使用late关键字延迟初始化
如果你更倾向于在构造函数体内处理初始化逻辑,可以用late关键字标记非空成员变量,延迟其初始化时机:
class Foo2 { late final DateTime date; Foo2({DateTime? date}) { date = date ?? DateTime.now(); } }
注意late要求变量必须在首次被访问前完成初始化,这里在构造函数体内赋值能保证这一点。不过这种方式不如初始化列表高效,因为初始化列表是在实例创建的早期阶段执行的。
内容的提问来源于stack exchange,提问作者Andrey
相关产品推荐
相关产品推荐

