Dart 基礎(chǔ)知識(shí)(四)

庫(kù)

? ??import?和?library?關(guān)鍵字可以幫助你創(chuàng)建一個(gè)模塊化和可共享的代碼庫(kù)准夷。代碼庫(kù)不僅只是提供 API 而且還起到了封裝的作用:以下劃線(_)開(kāi)頭的成員僅在代碼庫(kù)中可見(jiàn)诡延。?

? ??每個(gè) Dart 程序都是一個(gè)庫(kù),即便沒(méi)有使用關(guān)鍵字?library?指定歉摧。

? ? 使用庫(kù)

? ??????使用?import?來(lái)指定命名空間以便其它庫(kù)可以訪問(wèn)。

? ? ? ? 例如?import 'dart:html';

? ??????import?的唯一參數(shù)是用于指定代碼庫(kù)的 URI礼饱,對(duì)于 Dart 內(nèi)置的庫(kù)作郭,使用?dart:xxxxxx?的形式。而對(duì)于其它的庫(kù)逗抑,你可以使用一個(gè)文件系統(tǒng)路徑或者以?package:xxxxxx?的形式剧辐。?package:xxxxxx?指定的庫(kù)通過(guò)包管理器(比如 pub 工具)來(lái)提供:

? ??????import 'package:test/test.dart';

? ??指定庫(kù)前綴

? ??????如果你導(dǎo)入的兩個(gè)代碼庫(kù)有沖突的標(biāo)識(shí)符,你可以為其中一個(gè)指定前綴锋八。比如如果 library1 和 library2 都有 Element 類浙于,那么可以這么處理:

? ??指定庫(kù)前綴

? ??導(dǎo)入庫(kù)的一部分

? ??????如果你只想使用代碼庫(kù)中的一部分,你可以有選擇地導(dǎo)入代碼庫(kù):

導(dǎo)入庫(kù)的一部分

? ? 延遲加載庫(kù)

? ??????延遲加載(也常稱為?懶加載)允許應(yīng)用在需要時(shí)再去加載代碼庫(kù)挟纱,下面是可能使用到延遲加載的場(chǎng)景:

? ? ? ? 為了減少應(yīng)用的初始化時(shí)間羞酗;

????????處理 A/B 測(cè)試,比如測(cè)試各種算法的不同實(shí)現(xiàn)紊服;

????????加載很少會(huì)使用到的功能檀轨,比如可選的屏幕和對(duì)話框。

? ??????使用?deferred as?關(guān)鍵字?來(lái)標(biāo)識(shí)需要?延時(shí)加載?的代碼庫(kù):

? ??????????import 'package:greetings/hello.dart' deferred as hello;

? ??????當(dāng)實(shí)際需要使用到庫(kù)中 API 時(shí)先調(diào)用?loadLibrary?函數(shù)加載庫(kù)

? ??????使用?await?關(guān)鍵字?暫停代碼執(zhí)行?直到庫(kù)加載完成欺嗤;

? ??????loadLibrary?函數(shù)可以調(diào)用多次也沒(méi)關(guān)系参萄,代碼庫(kù)?只會(huì)被加載一次 (和 js 中 require 類似)

? ? 注意:

? ??????當(dāng)你使用延遲加載的時(shí)候需要牢記以下幾點(diǎn):

? ? ? ? 1 延遲加載的代碼庫(kù)中的常量需要在代碼庫(kù)被加載的時(shí)候才會(huì)導(dǎo)入煎饼,未加載時(shí)是不會(huì)導(dǎo)入的;

? ? ? ? 2 導(dǎo)入文件的時(shí)候無(wú)法使用延遲加載庫(kù)中的類型讹挎。如果你需要使用類型,則考慮把接口類型轉(zhuǎn)移到另一個(gè)庫(kù)中然后讓兩個(gè)庫(kù)都分別導(dǎo)入這個(gè)接口庫(kù);

? ? ? ? 3 Dart會(huì)隱式地將?loadLibrary()?導(dǎo)入到使用了?deferred as?命名空間?的類中吆玖。?loadLibrary()?函數(shù)返回的是一個(gè) Future筒溃。


異步支持

????Dart 代碼庫(kù)中有大量返回?Future?或?Stream?對(duì)象的函數(shù),這些函數(shù)都是異步的沾乘,它們會(huì)在耗時(shí)操作(比如I/O)執(zhí)行完畢前直接返回而不會(huì)等待耗時(shí)操作執(zhí)行完畢怜奖。

? ??async?和?await?關(guān)鍵字用于實(shí)現(xiàn)異步編程,并且讓你的代碼看起來(lái)就像是同步的一樣(同 JS)翅阵。

????Future

? ? 在 Dart 庫(kù)中隨處可見(jiàn) Future 對(duì)象歪玲,通常異步函數(shù)返回的對(duì)象就是一個(gè) Future迁央。當(dāng)一個(gè) future完成執(zhí)行后,future 中的值就已經(jīng)可以使用了滥崩, 如何使用 future 的值(和 JS 類似):

? ? 1 使用?async?和?await岖圈;

?async?和?await

? ??? ??async?函數(shù)能夠捕獲來(lái)自 Future 的異常;

? ??2 使用 Future API夭委, then 語(yǔ)法幅狮;

then

? ??????使用?catchError()?來(lái)處理一些 Future 對(duì)象可能拋出的錯(cuò)誤或者異常;

? ??????then().catchError()?組合是?try-catch?的異步版本株灸。

?then().catchError()?

鏈?zhǔn)疆惒骄幊?/b>

? ??????then()?方法返回一個(gè) Future 對(duì)象崇摄,這樣就提供了一個(gè)非常好的方式讓多個(gè)異步方法按順序依次執(zhí)行。如果用?then()?注冊(cè)的回調(diào)返回一個(gè) Future 慌烧,那么?then()?返回一個(gè)等價(jià)的 Future 逐抑。如果回調(diào)返回任何其他類型的值,那么?then()?會(huì)創(chuàng)建一個(gè)以該值完成的新 Future屹蚊;

同 JS?


等待多個(gè) Future

? ? 類似 promise.all

等待多個(gè) Future

Stream

? ??在 Dart API 中 Stream 對(duì)象隨處可見(jiàn)厕氨,Stream 用來(lái)表示一系列數(shù)據(jù)。例如汹粤,HTML 中的按鈕點(diǎn)擊就是通過(guò) stream 傳遞的命斧。同樣也可以將文件作為數(shù)據(jù)流來(lái)讀取。

? ??異步循環(huán)

? ??????它使用 Stream 的?listen()?方法來(lái)訂閱文件列表嘱兼,傳入一個(gè)搜索文件或目錄的函數(shù);

listen

? ????有時(shí)国葬,可以使用異步 for 循環(huán)?await for?,來(lái)替代 Stream API 芹壕。

await for

????監(jiān)聽(tīng)流數(shù)據(jù)(stream data)

? ??????使用?await for?或者使用?listen()?方法監(jiān)聽(tīng) stream汇四,來(lái)獲取每個(gè)到達(dá)的數(shù)據(jù)流值:

監(jiān)聽(tīng)流數(shù)據(jù)

? ??傳遞流數(shù)據(jù)(stream data)

? ??????在使用流數(shù)據(jù)前需要改變數(shù)據(jù)的格式,使用?transform()?方法生成具有不同類型數(shù)據(jù)的流:

?傳遞流數(shù)據(jù)

? ??????如果使用的是 Stream API踢涌,那么通過(guò)注冊(cè)?onError?監(jiān)聽(tīng)來(lái)處理錯(cuò)誤通孽。代碼位于注冊(cè)的?onDone?中,會(huì)在 stream 被關(guān)閉后執(zhí)行睁壁;

onError?
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末背苦,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子潘明,更是在濱河造成了極大的恐慌糠惫,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钉疫,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡巢价,警方通過(guò)查閱死者的電腦和手機(jī)牲阁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門固阁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人城菊,你說(shuō)我怎么就攤上這事备燃。” “怎么了凌唬?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵并齐,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我客税,道長(zhǎng)况褪,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任更耻,我火速辦了婚禮测垛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘秧均。我一直安慰自己食侮,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布目胡。 她就那樣靜靜地躺著锯七,像睡著了一般。 火紅的嫁衣襯著肌膚如雪誉己。 梳的紋絲不亂的頭發(fā)上眉尸,一...
    開(kāi)封第一講書(shū)人閱讀 49,144評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音巫延,去河邊找鬼效五。 笑死,一個(gè)胖子當(dāng)著我的面吹牛炉峰,可吹牛的內(nèi)容都是我干的畏妖。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼疼阔,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼戒劫!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起婆廊,我...
    開(kāi)封第一講書(shū)人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤迅细,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后淘邻,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體茵典,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年宾舅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了统阿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片彩倚。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖扶平,靈堂內(nèi)的尸體忽然破棺而出帆离,到底是詐尸還是另有隱情,我是刑警寧澤结澄,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布哥谷,位于F島的核電站,受9級(jí)特大地震影響麻献,放射性物質(zhì)發(fā)生泄漏们妥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一赎瑰、第九天 我趴在偏房一處隱蔽的房頂上張望王悍。 院中可真熱鬧,春花似錦餐曼、人聲如沸压储。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)集惋。三九已至,卻和暖如春踩娘,著一層夾襖步出監(jiān)牢的瞬間刮刑,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工养渴, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留雷绢,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓理卑,卻偏偏與公主長(zhǎng)得像翘紊,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子藐唠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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

  • 此文章是v1.0+時(shí)編寫(xiě)帆疟,年代久遠(yuǎn),小心有毒宇立,謹(jǐn)慎食用W俪琛!妈嘹! 一些重要概念 所有的東西都是對(duì)象柳琢,所有的對(duì)象都是類的...
    soojade閱讀 10,041評(píng)論 2 27
  • Flutter日漸火爆,因此在進(jìn)行Flutter學(xué)習(xí)前先學(xué)習(xí)一些其所使用的開(kāi)發(fā)語(yǔ)言dart的基礎(chǔ),這篇文章主要學(xué)習(xí)...
    Samlss閱讀 10,840評(píng)論 2 28
  • 一染厅、運(yùn)算符重載 Dart 支持運(yùn)算符重載痘绎,使用 operator 關(guān)鍵字,語(yǔ)法格式為:operator 運(yùn)算符 肖粮,...
    陌問(wèn)MW閱讀 1,175評(píng)論 0 5
  • 本文是對(duì) Dart 語(yǔ)言的官方文檔做了簡(jiǎn)單的翻譯和總結(jié),有不當(dāng)之處敬請(qǐng)指正尔苦。如果有時(shí)間和精力建議通讀官方文檔 he...
    小小小超子閱讀 10,467評(píng)論 8 22
  • http://dart.goodev.org/guides/libraries/library-tour Numb...
    Zszen閱讀 4,648評(píng)論 0 51