可以命名 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);
}
我正在为我正在接受的 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);
}