Primary Constructors 主构造函数

了解概念

最低 Dart 语言版本 3.13

作用:在类头部一行同时声明字段 + 主构造函数,大幅消除样板代码,运行时行为与传统构造完全一致,仅语法简化。

  1. Declaring parameters(声明型参数):头部参数带 var / final → 自动生成同名实例字段。
  2. Non-declaring parameters(普通参数):头部参数无 var/final → 仅构造入参,不生成类字段。
  3. In-body constructors(体内构造函数):写在类大括号内部的命名/工厂/重定向构造。
  4. 强制规则:拥有主构造的类,不能存在其他非重定向生成构造,保证所有实例必经主构造。

传统写法对比主构造简写

// 传统写法(冗余)
class Point {
  int x;
  int y;
  Point(this.x, this.y);
}

// 主构造简写
class Point(var int x, var int y);Code language: JavaScript (javascript)

字段自动生成规则

1. 带 var / final

自动创建实例字段

直接在类名后面的括号里面写字段变量

// x、y 自动成为类的成员变量
class Point(var int x, final int y);

void main() {
  final p = Point(10, 20);
  print(p.x); // 10
  print(p.y); // 20
  // p.y = 30; // 报错,y 是 final
}Code language: JavaScript (javascript)

以上执行后报错

D:\dartdemo\firstdart\bin>dart run
Building package executable...
Failed to build firstdart:firstdart:
firstdart.dart:2:13: Error: This requires the experimental 'primary-constructors' language feature to be enabled.
Try passing the '--enable-experiment=primary-constructors' command line option.
class Point(var int x, final int y);
            ^^^
firstdart.dart:2:12: Error: This requires the experimental 'primary-constructors' language feature to be enabled.
Try passing the '--enable-experiment=primary-constructors' command line option.
class Point(var int x, final int y);
           ^
firstdart.dart:2:36: Error: This requires the experimental 'primary-constructors' language feature to be enabled.
Try passing the '--enable-experiment=primary-constructors' command line option.
class Point(var int x, final int y);Code language: JavaScript (javascript)

原因是:class Point(var int x, final int y); 这种主构造器简写(Primary Constructors) 是 Dart 的实验性功能,当前稳定版 Dart 默认关闭,所以直接运行会报语法错误。

当前时间是2026年7月10日 14点55分,读者可能阅读本篇文章的时候,dart已经正式发布新版本,默认就支持此语法也不定。

可以用这样来临时测试

dart run --enable-experiment=primary-constructors

2. 无 var / final

仅临时参数,不生成字段

class User(String name) {
  // print(name); // 类内部直接访问参数,不会生成 this.name 字段
  final String msg = "Hi $name"; //编译错误
}

void main() {
  final u = User("Tom");
  // print(u.name); // 编译报错,不存在 name 字段
}Code language: JavaScript (javascript)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注