Skip to content
Inspire - Capo Productions

函数

函数参数

位置参数后可以跟两种类型参数:命名参数、可选位置参数,但这两种类型参数不能同时出现。

位置参数

调用函数时必须按照参数顺序传递参数,即使某些参数是可选的。

dart
void printUser(String name, int age, String? email) {
  print('$name - $age - $email');
}

printUser('张三', 18, 'zhangsan@example.com'); // 张三 - 18 - zhangsan@example.com
printUser('李四', 20, null); // 李四 - 20 - null

可选位置参数(用 [] 包裹)

因为调用时可以省略可选位置参数,所以定义参数时:

  • 要么使用 ? 标识为可选,调用时省略就是 null
  • 要么给定默认值。
dart
void printUser(String name, [int? age, String email = '123@qq.com']) {
  print('$name - $age - $email');
}
printUser('张三'); // 张三 - null - 123@qq.com

直接定义参数会报错:

Preview

命名参数(用 {} 包裹)

调用时必须使用参数名指定参数值,参数顺序可以任意。

因为命名参数默认是可选的,所以定义参数时:

  • 要么使用 ? 标识为可选,调用时省略就是 null
  • 要么给定默认值。
  • 要么使用 required 标识为必传。
dart
void printUser({required String name, int age = 18, String? email}) {
  print('$name - $age - $email');
}
printUser(name: '李四', age: 20, email: '456@qq.com'); // 李四 - 20 - 456@qq.com
printUser(name: '王五', age: 22); // 王五 - 22 - null
printUser(name: '赵六'); // 赵六 - 18 - null

直接定义参数会报错:

Preview

Flutter 中大量使用命名参数,如:

dart
ElevatedButton(
  onPressed: () {},
  child: Text('按钮'),
)

传入函数作为参数

dart
void fetchData(void Function(String data) onSuccess) {
onSuccess('数据来了');
}

fetchData((data) {
print(data);
});

箭头函数

箭头函数的参数列表必须使用括号包裹,即使只有一个参数,也不能省略。

dart
// 正确写法:
String result = ['张三', '李四', '王五'].firstWhere((item) => item == '李四', orElse: () => '');
dart
// 错误写法:
String result = ['张三', '李四', '王五'].firstWhere(item => item == '李四', orElse: () => '')
Preview