Functions - 二、Parameters 参数
2025-05-20 本文已影响0人
村雨灬龑
Parameters 参数#
一个函数可以有任意数量的所需位置参数。这些参数之后可以是命名参数,也可以是可选的位置参数(但不能两者都有)。
提示
一些api(尤其是Flutter小部件构造器)只使用命名参数,即使是强制参数。有关详细信息,请参见下一节。
在向函数传递参数或定义函数形参时,可以使用尾随逗号。
2.1必须参数
必须参数是调用函数时必须提供的参数。
void greet(String name) {
print('Hello, $name!');
}
greet('Alice'); // 输出: Hello, Alice!
2.2、命名参数
- 1、命名参数可以是必填的或可选的。
- 2、可选命名参数必须排列在一起放置在参数列表尾部并用{} 包裹,并且按名称传递,可以指定默认值但必须是编译时常量。
- 3、任意必填参数都必须出现在命名参数前面。
void describePerson(String name, {int? age, String occupation = 'unknown'}) {
print('Name: $name, Age: $age, Occupation: $occupation');
}
describePerson('Bob', occupation: 'Engineer', age: 30);
// 输出: Name: Bob, Occupation: Engineer, Age: 30
describePerson('Charlie', occupation: 'Artist');
// 输出: Name: Charlie, Occupation: Artist, Age: null
2.3、位置参数
- 1、位置参数可以是必填的或可选的。
- 2、可选位置参数必须排列在一起放置在参数列表尾部并用 [] 包裹,并且按位置传递,可以指定默认值但必须是编译时常量。
- 3、任意必填参数都必须出现在可选参数前面。
void describePerson(String name, [String occupation = 'unknown', int? age]) {
print('Name: $name, Occupation: $occupation, Age: $age');
}
describePerson('David', 'Developer', 25);
// 输出: Name: David, Occupation: Developer, Age: 25
describePerson('Eve');
// 输出: Name: Eve, Occupation: unknown, Age: null
2.4、默认参数
可为命名参数和位置参数设置默认值,当未指定参数时,使用函数中指定的默认值。
void describePerson(String name, {String occupation = 'unknown', int age = 0}) {
print('Name: $name, Occupation: $occupation, Age: $age');
}
describePerson('Frank');
// 输出: Name: Frank, Occupation: unknown, Age: 0
命名参数是可选的,除非它们被显式标记为required(必需的)。
在定义函数时,使用{param1, param2,…}来指定命名参数。如果你不提供默认值或用required标记命名参数,它们的类型必须为空,因为它们的默认值将为null:
/// Sets the [bold] and [hidden] flags ...
void enableFlags({bool? bold, bool? hidden}) {
...
}
若要为命名参数定义除null之外的默认值,请使用=指定默认值。指定的值必须是编译时常数。例如:
/// Sets the [bold] and [hidden] flags ...
void enableFlags({bool bold = false, bool hidden = false}) {
...
}
// bold will be true; hidden will be false.
enableFlags(bold: true);
如果你希望一个命名参数是强制性的,要求调用者为参数提供一个值,用required注释它们:
const Scrollbar({super.key, required Widget child});
如果有人试图在不指定子参数的情况下创建Scrollbar,那么分析程序就会报告一个问题。
提示
标记为required的参数仍然可以为null:const Scrollbar({super.key, required Widget? child});
您可能希望首先放置位置参数,但 Dart 并不要求这样做。Dart 允许将命名参数放置在参数列表中的任何位置,只要它适合您的 API:
repeat(times: 2, () {
...
});
可选的位置参数
将一组函数参数包装起来,[]会将其标记为可选的位置参数。如果不提供默认值,则它们的类型必须可空,因为它们的默认值为null:
String say(String from, String msg, [String? device]) {
var result = '$from says $msg';
if (device != null) {
result = '$result with a $device';
}
return result;
}
下面是不使用可选参数调用此函数的示例:
assert(say('Bob', 'Howdy') == 'Bob says Howdy');
下面是使用第三个参数调用此函数的示例:
assert(
say('Bob', 'Howdy', 'smoke signal') ==
'Bob says Howdy with a smoke signal',
);
要为除 之外的可选位置参数定义默认值null,请使用=指定默认值。指定的值必须是编译时常量。例如:
String say(String from, String msg, [String device = 'carrier pigeon']) {
var result = '$from says $msg with a $device';
return result;
}
assert(say('Bob', 'Howdy') == 'Bob says Howdy with a carrier pigeon');