Dart語法學習-2

1 方法

1.1 一等方法對象 Function

void fun() {
  print('hhaha');
}
void main() {
  Function f = fun; // 方法都是對象否彩,可以賦值給Function對象
  f(); // 調用fun()方法
}

Function還可以作為參數(shù)傳入

void fun2(Function function) { // 沒有辦法標識要傳遞的這個方法參數(shù)和返回值
  print('hhaha222');
  function(); // 調用傳入的方法疯攒,無參。如果傳入的方法是有參的列荔,運行時報錯
}
void main() {
  Function f2 = fun2; // 方法都是對象敬尺,可以賦值給Function對象
  // f2(); // 運行報錯,需要傳參
  f2(f); // 調用fun2()方法贴浙,傳入方法
  
  // 也可以傳入一個匿名方法
  f2(() {
    print('傳入的方法參數(shù)是匿名方法'); // 不會執(zhí)行砂吞,需要在fun2中調用才會執(zhí)行。
  });
  
  // 匿名方法可以隨意定義參數(shù)和返回值
  // 在fun2需要調用時悬而,傳入的參數(shù)需要和這里定義的參數(shù)類型呜舒、數(shù)量相同,否則會運行報錯。
  // 這就有些不方便了袭蝗,那如果傳入的參數(shù)錯誤唤殴,有什么辦法可以在編譯器就能檢查出來呢?這就要引入typedef關鍵字了到腥。
  f2((int a, int b) {
    return "1";
  });

typedef關鍵字的使用

// 定義一個類型朵逝,F(xiàn)類型,這個F類型其實就是一個方法乡范,接收兩個int參數(shù)配名,返回void
typedef void F(int i, int j);

定義一個方法,將F作為參數(shù)傳入晋辆。

void fun3(F f) {
  f(1, 2); // 這邊在編譯時就會校驗傳參是否正確渠脉。
  print('hhaha3333');
}

調用fun2()方法

// 方法1
Function f3 = fun3;
f3((int i, int j) { // 這邊好像要在運行時才會報錯。

});

// 方法2
fun3((i, j) { // 這邊在編譯時也就會校驗傳參是否正確瓶佳。

});

如果不想使用typedef芋膘,直接將方法的原形作為參數(shù)傳入也是可以的

void fun4(void f1(int i, int j)) { // 這種寫法可以表達傳遞的這個方法參數(shù)和返回值,但寫起來比較麻煩
  f1(1, 2);
}

使用場景示例:

如果我們之前在java中設置一個onClick監(jiān)聽霸饲,需要傳入接口为朋,并實現(xiàn)接口的方法。但在dart中就可以直接傳入一個方法接口厚脉。

typedef void onClick();

void setOnClickListener(onClick click){
  click(); // 通過這種方式就可以直接回調出去了习寸。
}

1.2 可選位置參數(shù)

可以當做是為了解決java中的方法重載問題。
如果我們提供了同一個方法名的兩個方法傻工,只是傳入的參數(shù)不同霞溪。fun(int a)、fun(int a精钮,int b)
在dart中威鹿,我們只需要提供一個方法fun(int a,int b)即可轨香,讓使用者決定傳入哪個忽你。只需要加上中括號即可

void fun(int a, int b) {}

// 可選位置參數(shù)
void fun1([int aa = 0, int bb = 0]) {
  // 最新的版本中一定要給一個默認值,否則編譯報錯臂容。之前版本好像沒問題
}
void main() {
  fun(1, 2); // 必須傳兩個參數(shù)

  fun1(); // 可以不傳參數(shù)
  fun1(1); // 也可以只傳一個科雳,1會賦值個aa。如果要傳bb參數(shù)脓杉,aa必須要傳
  fun1(1, 2); // 也可以傳兩個
}

1.3 可選命名參數(shù)

與可選位置參數(shù)不同的是糟秘,中括號改成大括號,就是可選命名參數(shù)

// 可選命名參數(shù)
void fun2({int aa = 0, int bb = 0}) {
  // 最新的版本中一定要給一個默認值球散,否則編譯報錯尿赚。之前版本好像沒問題
}
void main() {
  fun2(); // 不傳參數(shù),也沒問題
  // fun2(1); // 只傳一個參數(shù),這樣寫就不行了凌净。需要給傳入的這個值命名
  fun2(aaa: 1); // 帶入變量名悲龟,就可以給任意一個值傳值了。
  fun2(bbb: 2);
  fun2(bbb: 2, aaa: 1); // 順序也可以隨便傳
}

1.4 默認參數(shù)值

可選位置參數(shù)和可選命名參數(shù)都使用到了默認參數(shù)值冰寻。

1.5 匿名方法

沒有方法名的方法

void fun(Function function) {}

void main() {
  fun(() {

  });
  
  fun((int, String) {

  });
}

2 異常

void fun() {
  throw Exception();
}

void main() {
 // fun(); // 不需要像java中一樣調用try-catch须教。但是也支持

  try {
    fun();
  } catch (e) {
    // 不需要聲明類型,傳入一個變量名斩芭。e就是拋出的異常對象
    print(e);
  }

  try {
    fun();
  } catch (e, a) {
    // 打印結果:Exception
    print(e);

    // 也可以傳入兩個變量名轻腺。第二個參數(shù)是StackTrace 調用棧信息。打印結果:
    // #0      fun (package:untitled/%E5%BC%82%E5%B8%B8/%E5%BC%82%E5%B8%B8.dart:2:3)
    // #1      main (package:untitled/%E5%BC%82%E5%B8%B8/%E5%BC%82%E5%B8%B8.dart:16:5)
    // #2      _delayEntrypointInvocation.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:297:19)
    // #3      _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:192:12)
    print(a);
  }
}

在dart中可以拋出任意一種類型

void fun() {
  // throw Exception(); // 在dart中不光可以拋出一個異常
  // throw Error(); // 還可以拋出error
  // throw 1; // 還可以拋出一個int值
  // throw "異常信息"; // 拋出一個字符串
  throw fun2; // 甚至是一個方法划乖、類
}
void fun2() {
  print("我是一個方法");
}

根據(jù)不同的異常類型進行不同的處理

// 在catch前添加on+拋出類型贬养。
void main() {
  try {
    fun();
  } on Function catch (e) {
    print("拋出了一個方法 $e");
    e(); // 如果拋出的是一個方法,甚至可以直接在這里調用這個方法琴庵。
  } on int catch (e) {
    print("拋出了一個int值 $e");
  } on String catch (e) {
    print("拋出了一個字符串 $e");
  } on MissingPluginException catch (e) {
    print("拋出了一個MissingPluginException異常 $e");
  } on Exception catch (e) {
    print("拋出了一個Exception異常 $e");
  } finally { // finally用法和java一樣
  }
}
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末煤蚌,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子细卧,更是在濱河造成了極大的恐慌,老刑警劉巖筒占,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贪庙,死亡現(xiàn)場離奇詭異,居然都是意外死亡翰苫,警方通過查閱死者的電腦和手機止邮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來奏窑,“玉大人导披,你說我怎么就攤上這事“Nǎ” “怎么了撩匕?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長墨叛。 經(jīng)常有香客問我止毕,道長,這世上最難降的妖魔是什么漠趁? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任扁凛,我火速辦了婚禮,結果婚禮上闯传,老公的妹妹穿的比我還像新娘谨朝。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布字币。 她就那樣靜靜地躺著则披,像睡著了一般。 火紅的嫁衣襯著肌膚如雪纬朝。 梳的紋絲不亂的頭發(fā)上收叶,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天,我揣著相機與錄音共苛,去河邊找鬼判没。 笑死,一個胖子當著我的面吹牛隅茎,可吹牛的內容都是我干的澄峰。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼辟犀,長吁一口氣:“原來是場噩夢啊……” “哼俏竞!你這毒婦竟也來了?” 一聲冷哼從身側響起堂竟,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤魂毁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后出嘹,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體席楚,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年税稼,在試婚紗的時候發(fā)現(xiàn)自己被綠了烦秩。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡郎仆,死狀恐怖只祠,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情扰肌,我是刑警寧澤抛寝,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站狡耻,受9級特大地震影響墩剖,放射性物質發(fā)生泄漏。R本人自食惡果不足惜夷狰,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一岭皂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧沼头,春花似錦爷绘、人聲如沸书劝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽购对。三九已至,卻和暖如春陶因,著一層夾襖步出監(jiān)牢的瞬間骡苞,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工楷扬, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留解幽,地道東北人。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓烘苹,卻偏偏與公主長得像,于是被迫代替她去往敵國和親镣衡。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內容

  • Dart基本類型常用Api介紹 布爾類型 Dart中布爾類型很簡單望浩。如C語言中用bool聲明,對應true & f...
    StrivEver閱讀 610評論 0 0
  • Dart的所有東西都是對象惰说,包括數(shù)字曾雕,函數(shù)等。 它們都繼承自Object助被,默認是都是null(包括數(shù)字)切诀,所以數(shù)字...
    Visen遙清風閱讀 1,493評論 0 1
  • 本章主要對Dart語法進行介紹揩环,以及運行過程 使用前準備 Dart安裝進行Dart環(huán)境變量的配置幅虑,學習筆記1中已經(jīng)...
    percivals閱讀 305評論 0 1
  • 了解Dart 強類型編程語言,Dart之下一切皆對象 Dart 是一種跨平臺的客戶端開發(fā)語言丰滑。具有專門為客戶端優(yōu)化...
    youseewhat閱讀 10,176評論 0 3
  • 一. Dart入口方法 每一個flutter項目的lib目錄里面都有一個main.dart。這個文件就是flutt...
    騎馬縱天下閱讀 2,526評論 0 1