title: Dart 函数与方法date: 2021-07-15 11:04:36.214

updated: 2021-07-15 22:58:09.154
url: /?p=299
categories: Dart
tags:

函数与方法

函数与方法大差不差,方法是相对类和对象而言的,函数则是单独存在的代码段。

函数

1
2
3
4
5
6
7
8
9
10
int add(int i,int j) {
return i + j;
}
//也可以选择忽略类型(不推荐)
add( i, j) {
return i + j;
}
//对于只有一个表达式的方法,可以选择使用缩写语法来定义:
add(i, j) => i + j;
//在箭头 (=>) 和分号 (;) 之间只能使用一个 表达式

一等方法对象

Dart 是一个真正的面向对象语言,方法也是对象并且具有一种 类型  `Function`。 这意味着,方法可以赋值给变量,也可以当做其他方法的参数。可以把方法当做参数调用另外一个方法
1
2
3
4
5
6
var list = [1,2,3];
//将 print 方法 作为参数传递给forEach
list.forEach(print);
//可以将方法赋值给一个变量 类型为Funcation
var p = print;
list.forEach(p);
在Java中如果需要能够通知调用者或者其他地方方法执行过程的各种情况,可能需要指定一个接口,比如View的onClickListener。而在Dart中,我们可以直接指定一个回调方法给调用的方法,由调用的方法在合适的时机执行这个回调。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void setListener(Function listener){
listener("Success");
}
//或者
void setListener(void listener(String result)){
listener("Success");
}

//两种方式,第一种调用者根本不确定 回调函数的返回值、参数是些什么
//第二中则需要写这么一大段 太麻烦了。

//第三种:类型定义 将返回值为voide,参数为一个String的方法定义为一个类型。
typedef void Listener(String result);
void setListener(Listener listener){
listener("Success");
}

方法可以有两种类型的参数:必需的和可选的。 必需的参数需要在参数列表前面, 后面再定义可选参数。

可选命名参数

把方法的参数放到 `{}` 中就变成可选 命名参数
1
2
3
4
5
6
int add({int i, int j}) {
if(i == null || j == null){
return 0;
}
return i + j;
}
调用方法的时候,可以使用这种形式 `paramName: value` 来指定命名参数。例如:
1
2
3
4
5
6
7
//无必须参数
add()
//选择传递参数
add(i:1)
//位置无关
add(i:1, j:2)
add(j:1, i:2)

可选位置参数

把方法的参数放到 `[]` 中就变成可选 位置参数,传值时按照参数位置顺序传递
1
2
3
4
5
6
7
8
9
10
int add([int i, int j]) {
if(i == null || j == null){
return 0;
}
return i + j;
}
// 1赋值给i
add(1);
// 按照顺序赋值
add(1,2);

默认参数值

在定义方法的时候,可选参数可以使用 `=` 来定义可选参数的默认值。
1
2
int add([int i = 1, int j = 2]) => i + j;
int add({int i = 1, int j = 2}) => i + j;

匿名方法

没有名字的方法,称之为匿名方法,也可以称之为 lambda 或者 closure 闭包。匿名方法的声明为:
1
2
3
([Type] param1, …) { 
codeBlock;
};
如:
1
2
3
4
var list = ['apples', 'oranges', 'grapes', 'bananas', 'plums'];
list.forEach((i) {
print(list[i]);
});

注意:有时候我们会看到类似future.then((_) => someFunc());的代码,该代码中回调函数使用_作为函数的参数,其实_是通用命名参数,当我们不使用参数的时候用_表示即可。