方法
int add(int i,int j) {
return i + j;
}
//也可以選擇忽略類型(不推薦)
add( i, j) {
return i + j;
}
//對(duì)于只有一個(gè)表達(dá)式的方法庭瑰,可以選擇使用縮寫語法來定義:
add(i, j) => i + j;
//在箭頭 (=>) 和分號(hào) (;) 之間只能使用一個(gè) 表達(dá)式
一等方法對(duì)象
? Dart 是一個(gè)真正的面向?qū)ο笳Z言,方法也是對(duì)象并且具有一種 類型 Function
危喉。 這意味著宋渔,方法可以賦值給變量,也可以當(dāng)做其他方法的參數(shù)辜限』始穑可以把方法當(dāng)做參數(shù)調(diào)用另外一個(gè)方法
var list = [1,2,3];
//將 print 方法 作為參數(shù)傳遞給forEach
list.forEach(print);
//可以將方法賦值給一個(gè)變量 類型為Funcation
var p = print;
list.forEach(p);
我們可以通過typedef修飾方法,在開發(fā)中如果需要回調(diào)不需要java那樣使用抽象或者接口的方式薄嫡,使用方法就可以氧急。例如:
typedef void onClick();
class Button {
void setOnlickListener(onClick listener) {
listener();
}
}
方法可以有兩種類型的參數(shù):必需的和可選的。 必需的參數(shù)需要在參數(shù)列表前面毫深, 后面再定義可選參數(shù)吩坝。
可選命名參數(shù)
可選命名參數(shù)可以代替java的重載的方式,他可以將方法的參數(shù)放到 {}
中就變成可選 命名參數(shù)
int add({int i, int j}) {
if(i == null || j == null){
return 0;
}
return i + j;
}
? 調(diào)用方法的時(shí)候哑蔫,可以使用這種形式 paramName: value
來指定命名參數(shù)钉寝。例如:
//無必須參數(shù)
add()
//選擇傳遞參數(shù)
add(i:1)
//位置無關(guān)
add(i:1, j:2)
add(j:1, i:2)
可選位置參數(shù)
? 把方法的參數(shù)放到 []
中就變成可選 位置參數(shù)弧呐,傳值時(shí)按照參數(shù)位置順序傳遞
int add([int i, int j]) {
if(i == null || j == null){
return 0;
}
return i + j;
}
// 1賦值給i
add(1);
// 按照順序賦值
add(1,2);
默認(rèn)參數(shù)值
? 在定義方法的時(shí)候,可選參數(shù)可以使用 =
來定義可選參數(shù)的默認(rèn)值嵌纲。
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 對(duì)象為異常起便,不僅僅是實(shí)現(xiàn)了 Exception
或者Error
的對(duì)象。
throw new Exception('這是一個(gè)異常');
throw '這是一個(gè)異常';
throw 123;
? 與Java不同之處在于捕獲異常部分窖维,Dart中捕獲異常同樣是使用catch
語句榆综,但是Dart中的catch
無法指定異常類型。需要結(jié)合on
來使用铸史,基本語法如下:
try {
throw 123;
} on int catch(e){
//使用 on 指定捕獲int類型的異常對(duì)象
} catch(e,s){
//函數(shù) catch() 可以帶有一個(gè)或者兩個(gè)參數(shù)鼻疮, 第一個(gè)參數(shù)為拋出的異常對(duì)象, 第二個(gè)為堆棧信息 ( StackTrace 對(duì)象)
rethrow; //使用 `rethrow` 關(guān)鍵字可以 把捕獲的異常給 重新拋出
} finally{
}