方法
int add(int i,int j) {
return i + j;
}
//也可以选择忽略类型(不推荐)
add( i, j) {
return i + j;
}
//对于只有一个表达式的方法,可以选择使用缩写语法来定义:
add(i, j) => i + j;
//在箭头 (=>) 和分号 (;) 之间只能使用一个 表达式
一等方法对象
Dart 是一个真正的面向对象语言,方法也是对象并且具有一种 类型 Function
。 这意味着,方法可以赋值给变量,也可以当做其他方法的参数。可以把方法当做参数调用另外一个方法
var list = [1,2,3];
//将 print 方法 作为参数传递给forEach
list.forEach(print);
//可以将方法赋值给一个变量 类型为Funcation
var p = print;
list.forEach(p);
我们可以通过typedef修饰方法,在开发中如果需要回调不需要java那样使用抽象或者接口的方式,使用方法就可以。例如:
typedef void onClick();
class Button {
void setOnlickListener(onClick listener) {
listener();
}
}
方法可以有两种类型的参数:必需的和可选的。 必需的参数需要在参数列表前面, 后面再定义可选参数。
可选命名参数
可选命名参数可以代替java的重载的方式,他可以将方法的参数放到 {}
中就变成可选 命名参数
int add({int i, int j}) {
if(i == null || j == null){
return 0;
}
return i + j;
}
调用方法的时候,可以使用这种形式 paramName: value
来指定命名参数。例如:
//无必须参数
add()
//选择传递参数
add(i:1)
//位置无关
add(i:1, j:2)
add(j:1, i:2)
可选位置参数
把方法的参数放到 []
中就变成可选 位置参数,传值时按照参数位置顺序传递
int add([int i, int j]) {
if(i == null || j == null){
return 0;
}
return i + j;
}
// 1赋值给i
add(1);
// 按照顺序赋值
add(1,2);
默认参数值
在定义方法的时候,可选参数可以使用 =
来定义可选参数的默认值。
int add([int i = 1, int j = 2]) => i + j;
int add({int i = 1, int j = 2}) => i + j;
匿名方法
没有名字的方法,称之为匿名方法,也可以称之为 lambda 或者 closure 闭包。匿名方法的声明为:
([Type] param1, …) {
codeBlock;
};
如:
var list = ['apples', 'oranges', 'grapes', 'bananas', 'plums'];
list.forEach((i) {
print(list[i]);
});
异常
和 Java 不同的是,所有的 Dart 异常是非检查异常。 方法不一定声明了他们所抛出的异常, 并且不要求你捕获任何异常。
Dart 提供了 Exception
和Error
类型, 以及一些子类型。你还 可以定义自己的异常类型。但是, Dart 代码可以 抛出任何非 null 对象为异常,不仅仅是实现了 Exception
或者Error
的对象。
throw new Exception('这是一个异常');
throw '这是一个异常';
throw 123;
与Java不同之处在于捕获异常部分,Dart中捕获异常同样是使用catch
语句,但是Dart中的catch
无法指定异常类型。需要结合on
来使用,基本语法如下:
try {
throw 123;
} on int catch(e){
//使用 on 指定捕获int类型的异常对象
} catch(e,s){
//函数 catch() 可以带有一个或者两个参数, 第一个参数为抛出的异常对象, 第二个为堆栈信息 ( StackTrace 对象)
rethrow; //使用 `rethrow` 关键字可以 把捕获的异常给 重新抛出
} finally{
}