Functions - 二、Parameters 参数

2025-05-20  本文已影响0人  村雨灬龑

Parameters 参数#

一个函数可以有任意数量的所需位置参数。这些参数之后可以是命名参数,也可以是可选的位置参数(但不能两者都有)。

提示
一些api(尤其是Flutter小部件构造器)只使用命名参数,即使是强制参数。有关详细信息,请参见下一节。

在向函数传递参数或定义函数形参时,可以使用尾随逗号。

2.1必须参数

必须参数是调用函数时必须提供的参数。

void greet(String name) {
  print('Hello, $name!');
}

greet('Alice'); // 输出: Hello, Alice!

2.2、命名参数

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、位置参数

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');
上一篇 下一篇

猜你喜欢

热点阅读