Dart 是一种真正面向对象的语言,所以即便函数也是对象并且类型为 Function,这意味着函数可以被赋值给变量或者作为其它函数的参数。你也可以像调用函数一样调用 Dart 类的实例。详情请查阅 可调用的类

下面是定义一个函数的例子:
image.png
虽然高效 Dart 指南建议在 公开的 API 上定义返回类型,不过即便不定义,该函数也依然有效:

  1. main(List<String> args) {
  2. int number = 5;
  3. if (isPrime(number)) {
  4. print("$number是素数");
  5. } else {
  6. print("$number不是素数");
  7. }
  8. }
  9. isPrime(int number) {
  10. for (int i = 2; i < number; i++) {
  11. if (number % i == 0) {
  12. return false;
  13. }
  14. }
  15. return true;
  16. }

如果函数体内只包含一个表达式,你可以使用简写语法:

bool isPrimeHandler(int number) => isPrime(number) ? true : false;

语法 => 表达式 是 { return 表达式; } 的简写, => 有时也称之为 箭头 函数。

在 => 与 ; 之间的只能是 表达式 而非 语句。比如你不能将一个 if语句 放在其中,但是可以放置 条件表达式

参数

函数可以有两种形式的参数:必要参数可选参数。必要参数定义在参数列表前面,可选参数则定义在必要参数后面。可选参数可以是 命名的位置的

命名参数

命名参数默认为可选参数,除非他们被特别标记为 required。
当你调用函数时,可以使用 参数名: 参数值 的形式来指定命名参数。例如:

getUserInfo2(name, age: age, gender: gender);

定义函数时,使用 {参数1, 参数2, …} 来指定命名参数:

void getUserInfo2(String username, {var age, var gender}) { if (age != null && gender != null) { print(“name:$username,age:$age,gender:$gender”); } else { print(“name:$username,age and gender is private”); } }

虽然命名参数是可选参数的一种类型,但是你仍然可以使用 required 来标识一个命名参数是必须的参数,此时调用者必须为该参数提供一个值。例如:

void getUserInfo2(String username, {required var age, var gender}) { if (age != null && gender != null) { print(“name:$username,age:$age,gender:$gender”); } else { print(“name:$username,age and gender is private”); } }

如果调用这个函数的时候没有提供age参数,那么编译的时候就会产生报错

可选的位置参数

使用 [] 将一系列参数包裹起来作为位置参数:

void getUserInfo(String username, [var age, var gender]) { if (age != null && gender != null) { print(“name:$username,age:$age,gender:$gender”); } else { print(“name:$username,age and gender is private”); } }

只传入必须参数进行调用

String name = ‘yxr’; getUserInfo(name);

传入必须参数的同时,传入可选参数进行调用

String name = ‘yxr’; getUserInfo(name, age, gender);

默认参数值

可以用 = 为函数的命名参数和位置参数定义默认值,默认值必须为编译时常量,没有指定默认值的情况下默认值为 null。

*只传入必须参数进行调用

  1. main(List<String> args) {
  2. String name = 'yxr';
  3. int age = 19;
  4. String gender = "男";
  5. getUserInfo(name);
  6. }
  7. void getUserInfo(String username, [var age = 18, var gender = "男"]) {
  8. print("name:$username,age:$age,gender:$gender");
  9. }

结果:
image.png

*传入必须参数和可选参数

  1. main(List<String> args) {
  2. String name = 'yxr';
  3. int age = 19;
  4. String gender = "男";
  5. getUserInfo(name, age, gender);
  6. }
  7. void getUserInfo(String username, [var age = 18, var gender = "男"]) {
  8. print("name:$username,age:$age,gender:$gender");
  9. }

结果:
image.png

main() 函数

每个 Dart 程序都必须有一个 main() 顶级函数作为程序的入口, main() 函数返回值为 void 并且有一个 List 类型的可选参数。
下面是一个简单 main() 函数:

  1. main(){
  2. print("Hello,World");
  3. }


函数是对象

可以将函数作为参数传递给另一个函数。例如:

  1. main(List<String> args) {
  2. var list = [1, 2, 3, 4];
  3. list.forEach(printElement); // forEach函数接收的是一个函数作为参数
  4. }
  5. void printElement(int value) {
  6. print(value);
  7. }

运行结果:
image.png

你也可以将函数赋值给一个变量,比如:

  1. main(List<String> args) {
  2. printer();
  3. }
  4. var printer = () => print("Hello,World");

运行结果:
image.png