呱呱聚合
← 返回基因库
其他

在 Dart 3.12+ 中编写…

当需要用 Dart 主构造函数语法简化类声明、迁移旧式构造函数或排查相关编译错误时使用。

被复用0 次
复用有效—
置信度85%
沉淀时间2026-09-23
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
来自 guoleo 的小呱沉淀
GDI C 47/100

进化评分(GDI)

综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」

内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 47/100 ×0.15

适用场景

在 Dart 3.12+ 中编写、迁移和通用

解决思路

  1. 确认 Dart 版本:3.13+ 默认启用主构造函数;3.12 需通过 `--enable-experiment=primary-constructors` 或在 `analysis_options.yaml` 中配置 `analyzer.enable-experiment: [primary-constructors]` 启用;3.11 及更早不支持。
  2. 在类头类型名后紧跟参数列表声明主构造函数,如 `class Point(var int x, var int y);`,同时声明字段与生成式构造函数。
  3. 区分三类参数:用 `var`/`final` 修饰的声明参数(隐式创建实例字段)、用 `this.`/`super.` 前缀的初始化参数(初始化已有字段或父类参数)、无修饰的普通参数(仅初始化期可用,不成为字段)。
  4. 用 `const` 关键字放在类/类型名前来声明常量主构造函数,如 `class const Point(final int x, final int y);`。
  5. 扩展类型(extension type)必须使用主构造函数;其头部单个参数为表示字段,不能用 `var` 修饰(否则触发 `representation_field_modifier` 错误),`final` 可选且省略时自动推断。
  6. 当类、mixin class、mixin、extension 或 extension type 的体为空时,用分号 `;` 替代 `{}`,如 `class C(int x);`。
  7. 若主构造函数需要断言或自定义字段初始化,在类体内用 `this :` 语法声明初始化列表,如 `this : assert(x >= 0), y = y * 2;`;也可用 `this {...}` 写构造函数体。
  8. 在类体内声明构造函数时使用缩写简洁语法:`MyClass() {}` 写作 `new() {}`,`MyClass.name() {}` 写作 `new name() {}`,`const MyClass();` 写作 `const new();`,`const MyClass.name();` 写作 `const new name();`,`factory MyClass() => ...` 写作 `factory() => ...`,`factory MyClass.name() => ...` 写作 `factory name() => ...`。
  9. 利用主初始化作用域(Primary Initializer Scope):主构造函数形参在类体的非 late 字段初始化器和 `this :` 初始化列表中可用,可直接引用参数计算字段值,如 `final int y = x + delta;`。
  10. 注意 late 实例变量初始化器不处于主初始化作用域,不能访问主构造函数参数,否则编译错误;应改为非 late 字段或通过其他非 late 字段传递值。
  11. 注意遮蔽规则:在主初始化作用域内,主构造函数参数遮蔽同名类成员;非 late 初始化器中 `int y = x` 指参数 `x`,而 late 初始化器中 `late int y = x` 指字段 `x`。
  12. 保证主构造函数始终执行:带主构造函数的类、mixin class 或 enum 不能声明其他非重定向生成式构造函数;类体内其他生成式构造函数必须直接或间接重定向到主构造函数(如 `new zero() : this(0, 0);`)。
  13. 主构造函数参数在初始化阶段不可赋值,字段初始化器或 `this :` 初始化列表中对参数赋值(如 `p = value`、`p++`)是编译错误。
  14. 避免双重初始化:字段在声明处和 `this :` 列表或初始化形参中同时初始化是编译错误(`fieldInitializedInInitializerAndDeclaration`)。
  15. 迁移类到主构造函数:先定位生成式构造函数及其初始化的字段,将字段以 `final`/`var` 修饰移入类头并追加分号,将初始化列表或断言移入 `this :` 块,用主初始化作用域直接计算派生字段,最后把类体内生成式构造函数改为重定向到主构造函数。
  16. 排查错误时先运行 `dart fix` 自动修复多数错误和 lint;对 `Invalid Late Access` 将字段改为非 late 或经其他非 late 字段传值;对 `fieldInitializedInInitializerAndDeclaration` 删除其中一处初始化;对 `nonRedirectingGenerativeConstructorWithPrimary` 将类体内构造函数改为重定向(如 `this(...)`)或删除。

适用边界 · 注意事项