import 和 library 指令可以用來創(chuàng)建一個模塊化的,可共享的代碼庫。 庫不僅提供了 API ,而且對代碼起到了封裝的作用: 以下劃線 (_) 開頭的標(biāo)識符僅在庫內(nèi)可見。 每個 Dart 應(yīng)用程序都是一個庫 ,雖然沒有使用 library 指令。
庫可以通過包來分發(fā)。有關(guān) pub(集成在SDK中的包管理器)的信息,請參考 Pub Package 和 Asset Manager。
通過 import 指定一個庫命名空間中的內(nèi)如如何在另一個庫中使用。 例如,Dart Web應(yīng)用程序通常使用 dart:html庫,它們可以像這樣導(dǎo)入:
import 'dart:html';
import 參數(shù)只需要一個指向庫的 URI。 對于內(nèi)置庫,URI 擁有自己特殊的dart: 方案。 對于其他的庫,使用系統(tǒng)文件路徑或者 package: 方案 。 package: 方案指定由包管理器(如 pub 工具)提供的庫。例如:
import 'package:test/test.dart';
提示: URI 代表統(tǒng)一資源標(biāo)識符。 URL(統(tǒng)一資源定位符)是一種常見的URI。
如果導(dǎo)入兩個存在沖突標(biāo)識符的庫, 則可以為這兩個庫,或者其中一個指定前綴。 例如,如果 library1 和 library2 都有一個 Element 類, 那么可以通過下面的方式處理:
import 'package:lib1/lib1.dart';
import 'package:lib2/lib2.dart' as lib2;
// 使用 lib1 中的 Element。
Element element1 = Element();
// 使用 lib2 中的 Element。
lib2.Element element2 = lib2.Element();
如果你只使用庫的一部分功能,則可以選擇需要導(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) 可以讓應(yīng)用在需要的時候再加載庫。 下面是一些使用延遲加載庫的場景:
要延遲加載一個庫,需要先使用 deferred as 來導(dǎo)入:
import 'package:greetings/hello.dart' deferred as hello;
當(dāng)需要使用的時候,使用庫標(biāo)識符調(diào)用 loadLibrary() 函數(shù)來加載庫:
Future greet() async {
await hello.loadLibrary();
hello.printGreeting();
}
在前面的代碼,使用 await 關(guān)鍵字暫停代碼執(zhí)行一直到庫加載完成。 關(guān)于 async 和 await 的更多信息請參考 異步支持。
在一個庫上你可以多次調(diào)用 loadLibrary() 函數(shù)。但是該庫只是載入一次。
使用延遲加載庫的時候,請注意一下問題:
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)如何實現(xiàn)庫包的建議,請參考 Create Library Packages 這里面包括:
更多建議: