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];
list.forEach(print);
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"); }
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; }
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());
的代码,该代码中回调函数使用_
作为函数的参数,其实_
是通用命名参数,当我们不使用参数的时候用_
表示即可。