Dart基本語(yǔ)法學(xué)習(xí)記錄

參考《Flutter實(shí)戰(zhàn)》

獨(dú)特語(yǔ)法:

1灾锯、可選命名參數(shù)

2粘姜、..(級(jí)聯(lián)操作符)

3、?.(條件成員訪問(wèn)運(yùn)算符)

4颤难、??(判空賦值運(yùn)算符)

一些比較特別的語(yǔ)法

var 可接收任何類(lèi)型變量爽室,一旦賦值汁讼,類(lèi)型就確定

如:

var t ;
t = "hello world";
t = 100;(此時(shí)報(bào)錯(cuò))
dynamic/Object

dynamic和object聲明的變量可以賦值任何對(duì)象,而且可以隨時(shí)改變
如:

dynamic a;
Object b;
a = "hello world";
b = "hi world";
// 下面的代碼可以通過(guò)編譯
a = 100;
b = 100;

dynamic和Object不同的地方在于阔墩,dynamic聲明的對(duì)象編譯器可以提供所有可能
變量的方法使用嘿架,而Object則不提供
如:接上面代碼

a = "hello world";
b = "hi world";
print(a.length);
// 下面會(huì)報(bào)錯(cuò)
print(b.length);
final、const

被兩者修飾的變量啸箫,都是常量耸彪,值只能被設(shè)置一次;不同在于final是第一次使用時(shí)被初始化
const是編譯時(shí)常量
且使用者兩個(gè)忘苛,變量類(lèi)型可忽略
如:

final a = "hello world";
const b = "hi world";

函數(shù):

Dart函數(shù)聲明如果沒(méi)有顯式聲明返回值類(lèi)型時(shí)會(huì)默認(rèn)當(dāng)dynamic處理
如:

typedef bool CALLBACK();
// 返回類(lèi)型為dynamic
isNoble(int number) {
    return _nobleGases[number] != null;
}
// 需要傳入bool函數(shù)
void test(CALLBACK cb) {
    print(cb());
}
// 報(bào)錯(cuò) isNoble不是bool類(lèi)型
test(isNoble)蝉娜;

函數(shù)里面只有一個(gè)表達(dá)式,可以使用簡(jiǎn)寫(xiě)語(yǔ)法
如:

bool isNoble(int number) => _nobleGases[number] != null扎唾;

函數(shù)作為一個(gè)變量

var say = (str) {
    print(str);
}
say("hello world")召川;

函數(shù)作為參數(shù)傳遞

void dothing(var callback) {
    callback();
}
dothing(() => print("xxx"));

可選的位置參數(shù) []標(biāo)記的參數(shù)為可選參數(shù)
如:

String say(String from,String msg,[String to]) {
    var result = '$from says $msg';
    if (to != null) {
        result = '$result with a $to';
    }
    return result;
}

可選命名參數(shù) 使用{params1, params2,...}
如:

// 設(shè)置[flag]和[msg]標(biāo)志
void sendMsg({bool flag,String msg}){
    //...
}
//調(diào)用
sendMsg(flag:true,msg:"hello world");

異步支持:

Future(有點(diǎn)類(lèi)似Rxjava):表示一個(gè)異步操作的最終結(jié)果胸遇,異步成功荧呐,就執(zhí)行成功后的操作;失敗就捕獲錯(cuò)誤或停止后續(xù)操作纸镊。

一個(gè)Future只會(huì)對(duì)應(yīng)一個(gè)結(jié)果;Future所有API返回的還是Future對(duì)象倍阐,因此可用于鏈?zhǔn)秸{(diào)用
Future.then 接收異步結(jié)果 (對(duì)應(yīng)Rxjava中的onNext())
Future.catchError 異步發(fā)生錯(cuò)誤,可以捕獲 (對(duì)應(yīng)Rxjava中的onError())
Future.whenComplete 異步完成 (對(duì)應(yīng)Rxjava中的onComplete()薄腻,不過(guò)在Rxjava中onError和onComplete只執(zhí)行一個(gè),此處whenComplete無(wú)論如何都會(huì)執(zhí)行)
如:

Future.delayed(new Duration(seconds:2),()) {
    return "hello world";
}).then((data){
        // 正常執(zhí)行結(jié)束會(huì)執(zhí)行下面代碼
    print(data);
}).catchError((e){
    // 執(zhí)行過(guò)程發(fā)生異常會(huì)執(zhí)行下面代碼
    print(e);
}).whenComplete((){
    // 成功失敗都會(huì)執(zhí)行下面代碼
    print("done");
});

Future.wait 等待多個(gè)異步任務(wù)完成才進(jìn)行操作(類(lèi)似Rxjava中的flatMap,)

Future.wait([
    //  2秒后返回結(jié)果
    Future.delayed(new Duration(second:2),(){
        return "hello";
    })收捣,
    //  4秒后返回結(jié)果
    Future.delayed(new Duration(second:4),(){
        return "world";
    })
]).then((results){
    print(results[0] + reults[1]);
}).catchError((e){
    print(e);
})

Async/await
async 用來(lái)表示函數(shù)異步,會(huì)返回一個(gè)Future對(duì)象庵楷,可以使用then方法添加回調(diào)函數(shù)
await后面是一個(gè)Future罢艾,表示等待該異步任務(wù)完成,異步完成后才往下走(阻塞)
如:傳統(tǒng)的Future鏈?zhǔn)秸{(diào)用(模擬登陸)

// 定義異步任務(wù)
// 登陸
Future<int> login(String username,String pwd) {}
// 獲取用戶信息
Future<String> getUserInfo(int userId){}
// 保存用戶信息
Future saveUserInfo(String userInfo){}
// 鏈?zhǔn)秸{(diào)用
Future("baiaj","123456").then((id){
    return getUserInfo(id);
}).then((userInfo){
    return saveUserInfo(userInfo);
}).then((e){
    // 執(zhí)行接下來(lái)操作
}).catchError((e){
    // 錯(cuò)誤處理
    print(e);
})

使用async/await消除callback hell(回調(diào)地獄)

task() async {
    int id = await login("baiaj","123456");
    String userInfo = await getUserInfo(id);
    await saveUserInfo(userInfo);
    // 執(zhí)行接下來(lái)操作
}

Stream

可用于接收異步事件數(shù)據(jù)尽纽,在執(zhí)行異步任務(wù)時(shí)咐蚯,可以通過(guò)多次觸發(fā)成功或失敗事件來(lái)傳遞結(jié)果數(shù)據(jù)和錯(cuò)誤
常用于網(wǎng)絡(luò)任務(wù)下載 ,文件讀寫(xiě)等弄贿。

Stream.fromFutures([
    // 1秒后返回結(jié)果
    Future.delayed(new Duration(second:1),(){
        return "hello 1";
    }),
    // 2秒后拋出一個(gè)異常
    Future.delayed(new Duration(second:2),(){
        return AssetitonError("Error")春锋;
    }),
    // 3秒后返回結(jié)果
    Future.delayed(new Duration(second:3),(){
        return "hello 3";
    })
]).listen((data){
    print(data);
},onError:(e){
    print(e.message);
},onDone:(){
    // 完成
});

操作符

.. 級(jí)聯(lián)操作符(允許對(duì)同一對(duì)象執(zhí)行一系列操作)
如:

// 普通調(diào)用
var button  = getButton();
button.text = 'hello world';
button.classes.add('imp');
button.onClick.listen((e)=>window.alert('confirmed'));
// 級(jí)聯(lián)操作
getButton()
..text = 'hello world'
..classes.add('imp')
..onClick.listen((e)=>windown.alert('confirmed'));

?.(條件成員訪問(wèn)運(yùn)算符)
獲取成員,但是左邊的對(duì)象可以為null

UserInfo userInfo = new UserInfo();
String name = userInfo.name;
UserInfo userInfo2;
// 此時(shí)userInfo2為null差凹,獲取的name為null
name = userInfo?.name;

??(判空賦值運(yùn)算符)

var a = null;
String b = "hello world";
//  如果a為null期奔,則返回b,否則返回b
// 此處返回b
var result = a ?? b;  
print(result);
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末侧馅,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子呐萌,更是在濱河造成了極大的恐慌馁痴,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件肺孤,死亡現(xiàn)場(chǎng)離奇詭異罗晕,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)赠堵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén)小渊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人茫叭,你說(shuō)我怎么就攤上這事酬屉。” “怎么了杂靶?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵梆惯,是天一觀的道長(zhǎng)酱鸭。 經(jīng)常有香客問(wèn)我吗垮,道長(zhǎng),這世上最難降的妖魔是什么凹髓? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任烁登,我火速辦了婚禮,結(jié)果婚禮上蔚舀,老公的妹妹穿的比我還像新娘饵沧。我一直安慰自己,他們只是感情好赌躺,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布狼牺。 她就那樣靜靜地躺著,像睡著了一般礼患。 火紅的嫁衣襯著肌膚如雪是钥。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,156評(píng)論 1 308
  • 那天缅叠,我揣著相機(jī)與錄音悄泥,去河邊找鬼。 笑死肤粱,一個(gè)胖子當(dāng)著我的面吹牛弹囚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播领曼,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼鸥鹉,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蛮穿!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起毁渗,我...
    開(kāi)封第一講書(shū)人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤绪撵,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后祝蝠,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體音诈,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年绎狭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了细溅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡儡嘶,死狀恐怖喇聊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蹦狂,我是刑警寧澤誓篱,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布,位于F島的核電站凯楔,受9級(jí)特大地震影響窜骄,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜摆屯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一邻遏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧虐骑,春花似錦准验、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至颠黎,卻和暖如春另锋,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背盏缤。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工砰蠢, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人唉铜。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓台舱,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子竞惋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

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

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類(lèi)型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,109評(píng)論 1 32
  • 標(biāo)簽(空格分隔): Dart Flutter Dart在靜態(tài)語(yǔ)法方面和Java非常相似柜去,如類(lèi)型定義、函數(shù)聲明拆宛、泛型...
    黃昭鴻閱讀 417評(píng)論 0 0
  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,401評(píng)論 0 5
  • 憂傷的眼眸嗓奢,因?yàn)榈谝粓?chǎng)雪,變得平靜浑厚。它來(lái)的突然股耽,帶給我驚喜,無(wú)準(zhǔn)備的我站在寒風(fēng)中瑟瑟發(fā)抖钳幅,抬頭望天物蝙,雨中夾著雪,...
    涼城執(zhí)念閱讀 373評(píng)論 0 0
  • 雨薇跟老公大林離婚六年了敢艰,他們有一個(gè)女兒小萱诬乞,今年八歲,離婚時(shí)被判給了大林钠导,卻一直是大林的父母在撫養(yǎng)震嫉,住在鄉(xiāng)下。...
    圓圓_圈圈_圓圓閱讀 337評(píng)論 3 1