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

Can required parameters in a Dart constructor be named?

我正在为我正在接受的 Flutter/Dart class 使用一些 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);
}

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

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);
}

我尝试搜索 Flutter 开发文档以了解为什么会这样,或者在构造函数中使用所需参数及其名称的方法,但我没有找到任何东西。我当然可以想象我希望必需的构造函数参数具有名称的情况。

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

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

第二个例子使用“命名参数”。 {} 中定义的任何参数都被视为命名参数,必须使用名称标签进行调用。如飞镖语言之旅中所述,named parameters are optional unless they’re explicitly marked as required.

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

class Person {
  String? name;
  int? age;

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

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

void main() {
  final person = Person(name: 'Joe', age: 30);
  print(person);
}