目录
函数(方法)
可选命名参数
「required」
可选位置参数
默认参数值
匿名方法
函数是一等对象
异常
函数(方法)
Dart 是一个真正的面向对象语言,方法也是对象并且具有一种 类型 Function
。 这意味着,方法可以赋值给变量,也可以当做其他方法的参数。
「格式」:这个跟Java类似,比Java更方便一些,但是不支持方法重载,也就是说方法名不能一致
Type(返回类型) funcName(方法名) (parameter{参数})
{
return value;
}
//例如main函数
void main(){
}
int add(int i,int j) {
return i + j;
}
//也可以选择忽略类型(不推荐)
add( i, j) {
return i + j;
}
//对于只有一个表达式的方法,可以选择使用缩写语法来定义:
add(i, j) => i + j;
//在箭头 (=>) 和分号 (;) 之间只能使用一个 表达式 ,不能是 语句 。
//例如:不能使用 if 语句 ,但是可以是用 条件表达式.
「不支持方法重载」
函数可以有「两种类型」的参数:
-
必需的
-
可选的。
必需的参数需要在参数列表前面, 后面再定义可选参数。
可选命名参数
把方法的参数放到 {}
中就变成可选 命名参数。这个在后续的页面绘制中非常常见。
String add({String? a,String? b,String? c}){
return "a=$a,b=$b,c=$c";
}
调用方法的时候,可以使用这种形式 paramName: value
来指定命名参数。例如:
void main(){
//无必须参数
print(add());//a=null,b=null,c=null
//选择传递参数
print(add(a: "1"));//a=1,b=null,c=null
//选择传递参数,位置随意
print(add(b:"22",a:"11"));//a=11,b=22,c=null
//位置随意
print(add(a:"11",c:"33",b: "25"));//a=11,b=25,c=33
}
「required」
主要用于允许根据需要标记任何命名参数(函数或类),使得它们不为空。因为可选参数中必须有个 required
参数或者该参数有个默认值。
String addRequired({String? a, required String b,String? c}){
return "a=$a,b=$b,c=$c";
}
参数 b
被required修饰,也就说 b
是必传的,否则编译不通过。
前两个调用addRequired
函数因未传入b
直接报错。
print(addRequired());
print(addRequired(a: "1"));
print(addRequired(b: "66"));//a=null,b=66,c=null
print(addRequired(b:"99",a:"55"));//a=55,b=99,c=null
print(addRequired(a:"88",c:"66",b: "77"));//a=88,b=77,c=66
可选位置参数
把方法的参数放到 []
中就变成可选 位置参数。
String joint([String? a,String? b,String? c]){
return "a=$a,b=$b,c=$c";
}
传值时按照「参数位置顺序传递」。不存在跳过第二个参数,直接给第三个参数赋值。
print(joint());//a=null,b=null,c=null
//默认给第一个参数
print(joint("1"));//a=1,b=null,c=null
//给前两个参数
print(joint("22","11"));//a=22,b=11,c=null
//给三个参数
print(joint("11","33","25"));//a=11,b=33,c=25
默认参数值
在定义方法的时候,可选参数可以使用 =
来定义可选参数的默认值。
void userInfo({String name = "scc", int age = 15}) {
print("姓名:$name,年龄:$age");
}
如果不设置值,则直接使用默认值。
userInfo();//姓名:scc(默认值),年龄:15(默认值)
userInfo(age: 18);//姓名:scc(默认值),年龄:18
userInfo(name: "dart",age: 3);//姓名:dart,年龄:3
❝不推荐: 旧版本代码中可能使用的是冒号 (:) 而不是 = 来设置参数默认值。 原因是起初命名参数只支持 : 。 这种支持可能会被弃用。 建议 使用 = 指定默认值。
❞
匿名方法
没有名字的方法,称之为匿名方法,也可以称之为 lambda 或者 closure 闭包。匿名方法的声明为:
([Type] param1, …) {
codeBlock;
};
例如:
var list = ['apples', 'oranges', 'grapes', 'bananas', 'plums'];
list.forEach((item) {
print('${list.indexOf(item)}: $item');
});
函数是一等对象
一个函数可以作为另一个函数的参数。 例如:
var list = [1,2,3];
//将 print 方法 作为参数传递给forEach
list.forEach(print);
//可以将方法赋值给一个变量 类型为Funcation
var p = print;
list.forEach(p);
异常
和 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{
}