如何在 Dart 构造函数中设置 final/const 属性

Ste*_*art 5 constructor final properties dart

我有一个具有不可变属性 int id 的类。如何将 id 的值传递给构造函数?

class Hey
{
  var val;
  final int id;
  Hey(int id,var val)
  {
    this.id=id;
    this.val=val;
  }
}

void main()
{
  Hey hey=new Hey(0,1);
}
Run Code Online (Sandbox Code Playgroud)

hey.dart:10:10: 错误:找不到 Setter:'id'。this.id=id; ^^ hey.dart:10:10: 错误:没有为“Hey”类定义设置器“id”。- '嘿' 来自'hey.dart'。尝试将名称更正为现有 setter 的名称,或定义名为 'id' 的 setter 或字段。this.id=id; ^^

我认为 const 或 final 字段属性不需要设置器。API 不清楚如何处理这个问题。

jam*_*lin 4

来自Dart 语言之旅

\n\n
\n

注意:实例变量可以是,final但不能是const。最终实例变量必须在构造函数体在变量声明处启动 \xe2\x80\x94 之前通过构造函数参数或在构造函数\xe2\x80\x99s初始值设定项列表中进行初始化。

\n
\n\n

关于初始化列表的部分说:

\n\n
\n

除了调用超类构造函数之外,您还可以在构造函数主体运行之前初始化实例变量。用逗号分隔初始值设定项。

\n\n
// Initializer list sets instance variables before\n// the constructor body runs.\nPoint.fromJson(Map<String, num> json)\n    : x = json[\'x\'],\n      y = json[\'y\'] {\n  print(\'In Point.fromJson(): ($x, $y)\');\n}\n
Run Code Online (Sandbox Code Playgroud)\n
\n\n

所以一般的方式就是通过初始化列表。

\n\n

如上所述,您还可以在变量声明时进行初始化:

\n\n
class Foo {\n  final x = 42;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者可以通过构造函数参数初始化它们:

\n\n
class Foo {\n  final x;\n\n  Foo(this.x);\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

尽管这些其他方法可能并不总是适用。

\n