You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Flutter中常量类允许使用setter方法?

为什么带const构造的类能定义setter?

给你拆解清楚Dart里的关键逻辑:

  • const构造的作用只是允许类创建编译时常量实例,它并不限制你在类里定义setter、getter这类成员。类的成员定义和构造是不是const没有直接绑定关系。
  • 你写的这段代码编译时不报错,但只要运行时调用这个setter,肯定会抛出异常——因为你在setter里试图给final变量x赋值,而final变量初始化后就不能被修改,不管实例是不是const的。
  • 别搞混「带const构造的类」和「const实例」:哪怕类有const构造,你依然能创建非const的实例(比如写ConstClass(2)而不是const ConstClass(2)),但不管实例是不是const,final字段的不可变性都是生效的,所以这个setter本质上是无效的,调用就崩。
  • 编译器不拦着你定义这个setter,是因为编译阶段Dart不会去校验setter内部的赋值逻辑,只有运行时才会检查是否违反final变量的规则。

举个实际运行的例子,调用setter时会直接报错:

void main() {
  var obj = ConstClass(1);
  obj.x = 2; // 运行到这里抛出异常:Cannot assign to final variable 'x'.
}

内容的提问来源于stack exchange,提问作者Mahmoud Habib

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 14:32:03