Dart 构造函数中所需的参数可以命名吗?

Car*_*ith 0 parameters constructor dart

我正在为我正在参加的 Flutter/Dart 课程使用一些 Dart 代码。我期望以下代码能够编译,但没有编译:

class Person {
  String? name;
  int? age;

  Person(this.name, this.age);

  @override
  String toString() {
    return "name: $name\nage: $age";
  }
}

void main() {
  final person = Person(name: 'Joe', age: 30);
  print(person);
}
Run Code Online (Sandbox Code Playgroud)

当我将构造函数参数设置为可选时,如下所示,它会编译:

class Person {
  String? name;
  int? age;

  Person({this.name, this.age});

  @override
  String toString() {
    return "name: $name\nage: $age";
  }
}

void main() {
  final person = Person(name: 'Joe', age: 30);
  print(person);
}
Run Code Online (Sandbox Code Playgroud)

我尝试在 Flutter 开发文档中搜索这种情况的原因,或者在构造函数中包含所需参数及其名称的方法,但我没有找到任何内容。我当然可以想象我希望所需的构造函数参数具有名称的情况。

我的 pubspec.yaml 指定以下内容: environment: sdk: ">=2.12.0 <3.0.0"

mmc*_*n20 5

您的第一个示例使用了 dart 中所谓的“位置参数”。您不能使用名称标签调用位置参数,这就是第一个示例无法编译的原因。

\n

第二个示例使用“命名参数”。其中定义的任何参数都{}被视为命名参数,并且必须使用名称标签进行调用。正如 dart 语言教程中所解释的,命名参数是可选的,除非它们\xe2\x80\x99被明确标记为required

\n

因此,只需required在您想要需要的任何命名参数之前添加关键字即可。

\n
class Person {\n  String? name;\n  int? age;\n\n  Person({required this.name, required this.age});\n\n  @override\n  String toString() {\n    return "name: $name\\nage: $age";\n  }\n}\n\nvoid main() {\n  final person = Person(name: \'Joe\', age: 30);\n  print(person);\n}\n
Run Code Online (Sandbox Code Playgroud)\n