import 和 library 指令可以用來(lái)創(chuàng)建一個(gè)模塊化的,可共享的代碼庫(kù)。 庫(kù)不僅提供了 API ,而且對(duì)代碼起到了封裝的作用: 以下劃線 (_) 開(kāi)頭的標(biāo)識(shí)符僅在庫(kù)內(nèi)可見(jiàn)。 每個(gè) Dart 應(yīng)用程序都是一個(gè)庫(kù) ,雖然沒(méi)有使用 library 指令。
庫(kù)可以通過(guò)包來(lái)分發(fā)。有關(guān) pub(集成在SDK中的包管理器)的信息,請(qǐng)參考 Pub Package 和 Asset Manager。
通過(guò) import 指定一個(gè)庫(kù)命名空間中的內(nèi)如如何在另一個(gè)庫(kù)中使用。 例如,Dart Web應(yīng)用程序通常使用 dart:html庫(kù),它們可以像這樣導(dǎo)入:
import 'dart:html';
import 參數(shù)只需要一個(gè)指向庫(kù)的 URI。 對(duì)于內(nèi)置庫(kù),URI 擁有自己特殊的dart: 方案。 對(duì)于其他的庫(kù),使用系統(tǒng)文件路徑或者 package: 方案 。 package: 方案指定由包管理器(如 pub 工具)提供的庫(kù)。例如:
import 'package:test/test.dart';
提示: URI 代表統(tǒng)一資源標(biāo)識(shí)符。 URL(統(tǒng)一資源定位符)是一種常見(jiàn)的URI。
如果導(dǎo)入兩個(gè)存在沖突標(biāo)識(shí)符的庫(kù), 則可以為這兩個(gè)庫(kù),或者其中一個(gè)指定前綴。 例如,如果 library1 和 library2 都有一個(gè) Element 類(lèi), 那么可以通過(guò)下面的方式處理:
import 'package:lib1/lib1.dart';
import 'package:lib2/lib2.dart' as lib2;
// 使用 lib1 中的 Element。
Element element1 = Element();
// 使用 lib2 中的 Element。
lib2.Element element2 = lib2.Element();
如果你只使用庫(kù)的一部分功能,則可以選擇需要導(dǎo)入的 內(nèi)容。例如:
// Import only foo.
import 'package:lib1/lib1.dart' show foo;
// Import all names EXCEPT foo.
import 'package:lib2/lib2.dart' hide foo;
Deferred loading (也稱之為 lazy loading) 可以讓?xiě)?yīng)用在需要的時(shí)候再加載庫(kù)。 下面是一些使用延遲加載庫(kù)的場(chǎng)景:
要延遲加載一個(gè)庫(kù),需要先使用 deferred as 來(lái)導(dǎo)入:
import 'package:greetings/hello.dart' deferred as hello;
當(dāng)需要使用的時(shí)候,使用庫(kù)標(biāo)識(shí)符調(diào)用 loadLibrary() 函數(shù)來(lái)加載庫(kù):
Future greet() async {
await hello.loadLibrary();
hello.printGreeting();
}
在前面的代碼,使用 await 關(guān)鍵字暫停代碼執(zhí)行一直到庫(kù)加載完成。 關(guān)于 async 和 await 的更多信息請(qǐng)參考 異步支持。
在一個(gè)庫(kù)上你可以多次調(diào)用 loadLibrary() 函數(shù)。但是該庫(kù)只是載入一次。
使用延遲加載庫(kù)的時(shí)候,請(qǐng)注意一下問(wèn)題:
Dart VM difference: The Dart VM allows access to members of deferred libraries even before the call to loadLibrary()
. This behavior might change, so don’t depend on the current VM behavior. For details, see issue #33118.
有關(guān)如何實(shí)現(xiàn)庫(kù)包的建議,請(qǐng)參考 Create Library Packages 這里面包括:
更多建議: