Dart語言學(xué)習(xí)筆記

安裝

如果是windows系統(tǒng)迈窟,點(diǎn)擊安裝SDK:http://www.gekorm.com/dart-windows/
如果是Mac系統(tǒng),點(diǎn)擊安裝SDK:https://dart.dev/get-dart
可將dart安裝后的bin目錄加入到path路徑中蛇更,打開命令行工具错妖,使用命令dart --version確保dart已安裝到您電腦中即可揭保。

為什么要學(xué)些這門語言

目前Google推出的最新跨端解決方案Flutter,需要采用Dart語言編寫前端代碼。Flutter是目前市面上最好的跨端應(yīng)用解決方案摆出,另外朗徊,Dart語言學(xué)習(xí)門檻低性能好,支持動靜態(tài)編譯偎漫,并支持很多高級語言特性爷恳。

語法要點(diǎn)

dart語言借鑒了java,js,swift等高級的語言特性,并融入很多使用的語法糖象踊,我們來簡要做個(gè)概括温亲。

  • 在Dart中所有變量引用的都是對象,繼承Object杯矩,包括數(shù)字栈虚,函數(shù),null等都是對象史隆;
  • 在Dart運(yùn)行之前會解析您的代碼魂务,通過使用類型和編譯型常量來幫助Dart捕獲異常,讓代碼運(yùn)行的更高效泌射;
  • Dart支持在方法中定義方法粘姜,函數(shù)是Dart非常重要的概念;
  • Dart沒有public,private,protected關(guān)鍵字,如果要申明私有成員變量或函數(shù)請使用_打頭熔酷;
  • 可以在代碼中加入assert斷言語句以便讓有些錯誤在編譯器就能被捕獲孤紧;

啟動入口

Dart語言也是把main函數(shù)作為入口程序【苊兀可以給main函數(shù)傳入List<String>入?yún)斫邮彰钚袇?shù)列表号显。

內(nèi)置類型

dart語言使用var聲明變量,和swiftid類似躺酒,在編譯階段會自動確認(rèn)其類型押蚤。
dart語言只有以下幾種內(nèi)置類型:StringNumber羹应,bool活喊,Map,List,FunctionSymbols量愧,runes等,其中Number分為intdouble帅矗,注意沒有float之類的浮點(diǎn)數(shù)類型偎肃,可以對Number類型四則運(yùn)算,其中取整運(yùn)算符是~/浑此,有一些常用的屬性累颂,如isNaN,isEven(是否偶數(shù)),isOdd(是否奇數(shù))等,可以做一些簡單的類型轉(zhuǎn)換紊馏,如int.parse("1");double.parse("1.1"等料饥,注意在Dart中沒有數(shù)組類型,而統(tǒng)一使用List朱监;

  • 字符串:使用"""多行字符串聲明岸啡,可以使用$xx${xx}在字符串中使用變量占位符,相鄰的字符串拼接的+可省略赫编,但拼接的內(nèi)容不能是1個(gè)空格巡蘸。
  • 靜態(tài)變量:可以使用關(guān)鍵字static修飾類訪問的變量。
  • Dart字符串是UTF-16 code units字符序列擂送,所以支持emoji表情符悦荒,如笑臉: \u{1f600};

類的使用

Dart和Java等高級語言一樣嘹吨,可以定義類搬味,并使用extends繼承類,使用@override注解聲明你要重寫的函數(shù)蟀拷,使用super調(diào)用重寫這個(gè)父類的函數(shù)碰纬。

image

如果要在代碼嘗試使用類中不存在的方法或?qū)嵗兞繖z測時(shí)做出反應(yīng),可以重寫noSuchMethod匹厘。

可以使用abstract修飾符定義無法實(shí)例化的類嘀趟;

一個(gè)類可以使用implements實(shí)現(xiàn)多個(gè)接口;

可以使用enum定義枚舉;

一個(gè)類可以通過..使用級聯(lián)調(diào)用語法愈诚,比如querySelector("#id")..text="xxx"..onClick.listen(xxx);

泛型

泛型有以下好處:

  • 減少代碼重復(fù):泛型允許您在多種類型之間共享單個(gè)接口和實(shí)現(xiàn)她按,同時(shí)仍然利用靜態(tài)分析;
  • 代碼更友好炕柔,編譯期提醒:比如列表中的元素指定泛型類型可確保不符合類型的元素被添加酌泰;
  • 與Java不同,Dart會在運(yùn)行期攜帶類型信息匕累,如List<String>類型的列表陵刹,可以使用lists.runtimeType(),獲取到類型信息List<String>欢嘿;
  • 可以配合extends來限定參數(shù)類型衰琐;
  • 泛型可以被使用在包括函數(shù),函數(shù)表達(dá)式炼蹦,類方法羡宙,類型參數(shù),返回類型等中掐隐;

重寫操作符

我們可以通過關(guān)鍵字operator關(guān)鍵字重寫包括:+,-,*,/,<,>,<=,>=,%,/,[],[]=,,=,<<,>>等十幾種運(yùn)算符:

image

類型自動推斷

在聲明一個(gè)變量時(shí)狗热,無需指定類型钞馁,系統(tǒng)會自動推斷,比如var m= {"a":1};var i=1;匿刮,系統(tǒng)自動認(rèn)為mMap類型僧凰,i整型。如果一個(gè)變量被賦值后熟丸,在后續(xù)會被另外類型的變量值覆寫训措,應(yīng)該使用dynamic聲明這個(gè)變量。

final和const

用來定義常量虑啤,都必須初始化隙弛,const是編譯時(shí)常量,只能用編譯時(shí)常量來初始化狞山,但final可以用變量來初始化全闷,比如final time = new DateTime.now();是允許的。

函數(shù)

函數(shù)類型是Function萍启,函數(shù)可以賦值总珠,也可以作為參數(shù)傳遞給其他函數(shù),這是函數(shù)式編程典型特征勘纯。在Dart中不能重載函數(shù)局服,函數(shù)可以不指定返回類型(實(shí)際會返回Object),而實(shí)際上函數(shù)體可以返回任意類型驳遵,如果在函數(shù)體中沒有return淫奔,則返回null。

在我們編寫Flutter程序時(shí)堤结,經(jīng)常會碰到函數(shù)體只是返回一個(gè)布局唆迁,那么函數(shù)體在一條語句的情況下,可以簡寫成:void printxx(num n) => print(n);竞穷,注意箭頭的用法唐责。

另外函數(shù)的參數(shù)非常有意思,可指定可選參數(shù)(使用{}將可選參數(shù)括起來)瘾带,可以通過:或=指定參數(shù)默認(rèn)值鼠哥,也可以使用位置參數(shù)(用[]括起來),注意位置參數(shù)如果有多個(gè)看政,必須跟實(shí)際傳入的是實(shí)參一一對應(yīng)朴恳。

函數(shù)可以用來賦值,比如:var uu = (msg) => "'${msg.toUpperCase()}'";允蚣,以上uu是一個(gè)函數(shù)于颖,將傳入的字符串轉(zhuǎn)換成大寫,可以直接調(diào)用uu("hello")即返回HELLO厉萝。

函數(shù)也可以作為參數(shù),比如Future.delayed(new Duration(seconds: 2),(){return "hi";}),第二個(gè)參數(shù)就是一個(gè)函數(shù)谴垫,函數(shù)作為參數(shù)的用法在Flutter編程中隨處可見章母,是一個(gè)非常重要的用法。

構(gòu)造函數(shù)

Dart是不支持函數(shù)重載的翩剪,那多個(gè)構(gòu)造函數(shù)怎么辦乳怎?我們可以使用命名構(gòu)造函數(shù),比如Text.a(this.a);Test.ab(this.a,this.b)等命令構(gòu)造函數(shù)

閉包

一個(gè)閉包是一個(gè)方法對象前弯,不管該對象在何處被調(diào)用蚪缀, 該對象都可以訪問其作用域內(nèi)的變量。方法可以封閉定義到其作用域內(nèi)的變量恕出。比如以下代碼:

Function makeAdder(num addBy) {
  return (num i) => addBy + i;
}
main() {
  var add2 = makeAdder(2);
  var add4 = makeAdder(4);
  assert(add2(3) == 5);
  assert(add4(3) == 7);
}

異步支持

Dart類庫有非常多的返回Future或者Stream對象的函數(shù)询枚。 這些函數(shù)被稱為異步函數(shù)。async和await關(guān)鍵詞支持了異步編程浙巫,允許您寫出和同步代碼很像的異步代碼金蜀。

image

以上寫法在Flutter編程中經(jīng)常被用到,將異步的調(diào)用方式以同步的寫法呈現(xiàn)的畴,使得我們理解起來更加直觀渊抄。

元數(shù)據(jù)注解

元數(shù)據(jù)注解以字符開頭@,后跟對編譯時(shí)常量(如deprecated)的引用或?qū)ΤA繕?gòu)造函數(shù)的調(diào)用丧裁。元數(shù)據(jù)可以出現(xiàn)在护桦,typedef煎娇,類型參數(shù)二庵,構(gòu)造函數(shù)工廠逊桦,函數(shù)眨猎,字段參數(shù)或變量聲明之前以及導(dǎo)入或?qū)С鲋噶钪扒烤D梢允褂梅瓷湓谶\(yùn)行時(shí)檢索元數(shù)據(jù)睡陪,所有Dart代碼都有兩個(gè)注解:@deprecated@override。你可以定義自己的元數(shù)據(jù)注解匿情,如下:

image

之后就可以使用注解:@todo('name','ddd')兰迫。

Mixin

有時(shí)候?qū)⒛承┬袨槎x為Mixin,以便讓其他類通過with來實(shí)現(xiàn)多重繼承炬称,減少代碼冗余汁果。比如var CC=T with A,B,表示CC類中的方法是T,A,B三個(gè)類的方法的并集玲躯,當(dāng)有函數(shù)名重名的時(shí)候据德,B的方法覆蓋A鳄乏,T的,A方法覆蓋T的棘利。這樣就變相支持了多重繼承橱野。

反射

dart:mirrors 庫提供了基本的反射支持∩泼担可以通過#打頭定義Symbols水援,這樣在代碼混交的情況下也可以保持標(biāo)識符名稱。比如你知道類名茅郎,可以直接用new Symbol("CLASSNAME")來構(gòu)建symbol蜗元。比如我們動態(tài)調(diào)用C類的d方法,d方法有一個(gè)參數(shù):

class C{
var tt = "test";
C(){};
static d(msg){print(msg);}
a(){print("C.a";)}
}
//調(diào)用類的靜態(tài)函數(shù)
ClassMirror cc = reflectClass(C);
cc.invoke(Symbol("d"), ["hello"]);
//如果調(diào)用實(shí)例函數(shù)
InstanceMirror mm = cc.newInstance(Symbol.empty, []);
mm.invoke(Symbol("a"), []);
//獲取類的成員變量
print(mm.reflectee.tt);

此外系冗,還可以通過反射獲取注解奕扣,元數(shù)據(jù)等,具體可參考:http://www.reibang.com/p/d68278d19f79
Flutter中禁止使用反射毕谴。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末成畦,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子涝开,更是在濱河造成了極大的恐慌循帐,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件舀武,死亡現(xiàn)場離奇詭異拄养,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)银舱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進(jìn)店門瘪匿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人寻馏,你說我怎么就攤上這事棋弥。” “怎么了诚欠?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵顽染,是天一觀的道長。 經(jīng)常有香客問我轰绵,道長粉寞,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任左腔,我火速辦了婚禮唧垦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘液样。我一直安慰自己振亮,他們只是感情好巧还,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著坊秸,像睡著了一般狞悲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上妇斤,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天,我揣著相機(jī)與錄音丹拯,去河邊找鬼站超。 笑死,一個(gè)胖子當(dāng)著我的面吹牛乖酬,可吹牛的內(nèi)容都是我干的死相。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼咬像,長吁一口氣:“原來是場噩夢啊……” “哼算撮!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起县昂,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤肮柜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后倒彰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體审洞,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年待讳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了芒澜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,030評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡创淡,死狀恐怖痴晦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情琳彩,我是刑警寧澤誊酌,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站汁针,受9級特大地震影響术辐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜施无,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一辉词、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧猾骡,春花似錦瑞躺、人聲如沸敷搪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赡勘。三九已至,卻和暖如春捞镰,著一層夾襖步出監(jiān)牢的瞬間闸与,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工岸售, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留践樱,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓凸丸,卻偏偏與公主長得像拷邢,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子屎慢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內(nèi)容