Dart中两种构造器初始化final变量为何仅一种可正常运行?
Dart构造器初始化final变量规则说明
两种构造器的核心区别
- 第一种
Test(this.a, this.b)属于Dart的初始化形参语法,本质是构造器初始化列表的简写,赋值操作发生在类实例完全创建完成之前。 - 第二种是将赋值逻辑放在构造函数的函数体内部,执行顺序晚于实例初始化阶段。
报错原因与相关规则
Dart中final修饰的实例变量要求必须在实例创建完成前完成唯一一次赋值,赋值后不可修改,合法的赋值时机只有两个:
- 声明变量时直接赋值;
- 在构造器的初始化列表阶段完成赋值,包括使用
this.参数的初始化形参写法、手动编写初始化列表:
// 手动写初始化列表和第一种写法效果完全等价,也可以正常给final变量赋值 Test(int a, int b): a = a, b = b;
构造函数体的执行时机,是在初始化列表执行完毕、实例的基础结构已经构建完成之后,此时final变量已经被标记为初始化完成不可修改,在函数体中执行this.a = a本质是修改不可变的final变量,因此触发编译错误。
而第三种示例中移除了final修饰符,变量本身支持修改,因此在构造函数体内赋值不受限制,可以正常运行。
内容的提问来源于stack exchange,提问作者Ayrix
相关产品推荐
相关产品推荐

