安裝
如果是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
聲明變量,和swift
的id
類似躺酒,在編譯階段會自動確認(rèn)其類型押蚤。
dart語言
只有以下幾種內(nèi)置類型:String
,Number
羹应,bool
活喊,Map
,List
,Function
,Symbols
量愧,runes
等,其中Number
分為int
和double
帅矗,注意沒有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ù)碰纬。
如果要在代碼嘗試使用類中不存在的方法或?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)算符:
類型自動推斷
在聲明一個(gè)變量時(shí)狗热,無需指定類型钞馁,系統(tǒng)會自動推斷,比如var m= {"a":1};var i=1;
匿刮,系統(tǒng)自動認(rèn)為m
是Map類型
僧凰,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)鍵詞支持了異步編程浙巫,允許您寫出和同步代碼很像的異步代碼金蜀。
以上寫法在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ù)注解匿情,如下:
之后就可以使用注解:
@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中禁止使用反射毕谴。