使用 import 和 library 指令可以幫助你創(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)于 async 和 await 的更多信息請(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ā)布。