Dart中如何在构造函数初始化列表访问常量构造器实例的属性?
这个问题的核心是Dart对常量表达式的语法限制,你需要知道以下两条关键规则:
- 首先,
const B()本身是合法的常量表达式:它调用const构造函数生成的实例会在编译期固化,所以可以直接赋值给D类的final字段b,没有问题。 - 其次,在Dart 2.17版本之前,
常量对象.实例字段的写法不属于合法的常量表达式:哪怕这个对象是const构造生成的,哪怕对应的字段是final且用常量初始化,也不能在常量上下文里直接访问实例字段。
背后的原因是:实例字段的访问本质上是调用隐式的getter方法,早期Dart的常量规则不允许在常量表达式中调用任何实例方法(包括隐式getter),只有静态const成员的访问是被允许的。
如果你用的是Dart 2.17及以上版本,只需要调整SDK约束的最低版本到2.17,你的E类代码就可以正常运行,不需要修改逻辑。如果你需要兼容旧版本,可以用以下两种方案修改:
- 把B类的
a字段改为静态const成员:
class B { const B(); static const A a = const A(); } // 此时E类的初始化列表改为a = B.a即可
- 把E类的构造函数改为非const,或者把
const B().a的计算逻辑移到构造函数体内部(如果不需要const构造的话)。
另外补充说明:即便是在支持常量访问实例字段的新版本Dart里,也要求被访问的实例字段必须是final且在编译期能确定值,否则依然会触发报错。
内容的提问来源于stack exchange,提问作者Valentin Vignal
相关产品推荐
相关产品推荐

