Dart Libraries and visibility(庫(kù)和可見性)

使用 importlibrary 指令可以幫助你創(chuàng)建 模塊化的可分享的代碼。庫(kù)不僅僅提供 API, 還是一個(gè)私有單元:以下劃線 (_) 開頭的標(biāo)識(shí)符只有在庫(kù) 內(nèi)部可見。每個(gè) Dart app 都是一個(gè)庫(kù), 即使沒有使用 library 命令也是一個(gè)庫(kù)。

庫(kù)可以使用 Dart package 工具部署。參考 Pub Package 和 Asset Manager 來(lái)獲取關(guān)于 pub(Dart 的包管理工具) 的更多信息。

Using libraries(使用庫(kù))

使用 import 來(lái)指定一個(gè)庫(kù)如何使用另外 一個(gè)庫(kù)。

例如, Dart web 應(yīng)用通常使用 dart:html 庫(kù),然后可以這樣導(dǎo)入庫(kù):

<pre class="prettyprint lang-dart prettyprinted" style="">import 'dart:html';</pre>

import 必須參數(shù)為庫(kù) 的 URI。 對(duì)于內(nèi)置的庫(kù),URI 使用特殊的 dart: scheme。 對(duì)于其他的庫(kù),你可以使用文件系統(tǒng)路徑或者 package: scheme。 package: scheme 指定的庫(kù)通過(guò)包管理器來(lái)提供, 例如 pub 工具。

<pre class="prettyprint lang-dart prettyprinted" style="">import 'dart:io'; import 'package:mylib/mylib.dart'; import 'package:utils/utils.dart';</pre>

注意: URI 代表 uniform resource identifier。 URLs (uniform resource locators) 是一種常見的 URI。

Specifying a library prefix(指定庫(kù)前綴)

如果你導(dǎo)入的兩個(gè)庫(kù)具有沖突的標(biāo)識(shí)符, 則你可以使用庫(kù)的前綴來(lái)區(qū)分。 例如,如果 library1 和 library2 都有一個(gè)名字為 Element 的類, 你可以這樣使用:

<pre class="prettyprint lang-dart prettyprinted" style="">import 'package:lib1/lib1.dart'; import 'package:lib2/lib2.dart' as lib2; // ... Element element1 = new Element(); // Uses Element from lib1. lib2.Element element2 = new lib2.Element(); // Uses Element from lib2.</pre>

Importing only part of a library(導(dǎo)入庫(kù)的一部分)

如果你只使用庫(kù)的一部分功能,則可以選擇需要導(dǎo)入的 內(nèi)容。例如:

<pre class="prettyprint lang-dart prettyprinted" style="">// Import only foo. import 'package:lib1/lib1.dart' show foo; // Import all names EXCEPT foo. import 'package:lib2/lib2.dart' hide foo;</pre>

Lazily loading a library(延遲載入庫(kù))

Deferred loading (也稱之為 lazy loading) 可以讓應(yīng)用在需要的時(shí)候再 加載庫(kù)。 下面是一些使用延遲加載庫(kù)的場(chǎng)景:

  • 減少 APP 的啟動(dòng)時(shí)間。
  • 執(zhí)行 A/B 測(cè)試,例如 嘗試各種算法的 不同實(shí)現(xiàn)。
  • 加載很少使用的功能,例如可選的屏幕和對(duì)話框。

要延遲加載一個(gè)庫(kù),需要先使用 deferred as 來(lái) 導(dǎo)入:

<pre class="prettyprint lang-dart prettyprinted" style="">import 'package:deferred/hello.dart' deferred as hello;</pre>

當(dāng)需要使用的時(shí)候,使用庫(kù)標(biāo)識(shí)符調(diào)用 loadLibrary() 函數(shù)來(lái)加載庫(kù):

<pre class="prettyprint lang-dart prettyprinted" style="">greet() async { await hello.loadLibrary(); hello.printGreeting(); }</pre>

在前面的代碼, 使用 await 關(guān)鍵字暫停代碼執(zhí)行一直到庫(kù)加載完成。 關(guān)于 asyncawait 的更多信息請(qǐng)參考 異步支持

在一個(gè)庫(kù)上你可以多次調(diào)用 loadLibrary() 函數(shù)。 但是該庫(kù)只是載入一次。

使用延遲加載庫(kù)的時(shí)候,請(qǐng)注意一下問(wèn)題:

  • 延遲加載庫(kù)的常量在導(dǎo)入的時(shí)候是不可用的。 只有當(dāng)庫(kù)加載完畢的時(shí)候,庫(kù)中常量才可以使用。
  • 在導(dǎo)入文件的時(shí)候無(wú)法使用延遲庫(kù)中的類型。 如果你需要使用類型,則考慮把接口類型移動(dòng)到另外一個(gè)庫(kù)中, 讓兩個(gè)庫(kù)都分別導(dǎo)入這個(gè)接口庫(kù)。
  • Dart 隱含的把 loadLibrary() 函數(shù)導(dǎo)入到使用 deferred as *的命名空間* 中。 loadLibrary() 方法返回一個(gè) Future。

Implementing libraries(實(shí)現(xiàn)庫(kù))

參考 創(chuàng)建庫(kù) 來(lái)了解如何創(chuàng)建一個(gè)庫(kù)并發(fā)布。

摘錄:http://dart.goodev.org/guides/language/language-tour#libraries-and-visibility%E5%BA%93%E5%92%8C%E5%8F%AF%E8%A7%81%E6%80%A7
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容