庫和可見性
- 每個 Dart app 都是一個庫, 即使沒有使用 library 命令也是一個庫。
- 使用 import 和 library 指令可以創建模塊化的可分享的代碼。
- 庫不僅僅提供 API, 還是一個私有單元:以下劃線 (_) 開頭的標識符只有在庫內部可見。
- 庫可以使用 Dart package 工具部署。參考Pub Package 和 Asset Manager
使用庫
- dart:庫的uri/內置庫的scheme
- 其他庫使用文件系統路徑或者package:scheme(package: scheme 指定的庫通過包管理器來提供, 例如 pub 工具。)
//web應用通常使用 dart:html 庫,內置庫
import 'dart:html';
//包管理器提供的庫
import 'package:mylib/mylib.dart';
import 'package:utils/utils.dart';
指定庫前綴
如果導入的兩個庫具有衝突的標識符, 則可以使用庫的前綴來區分。
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.
導入庫的一部分
如果只使用庫的一部分功能,則可以選擇需要導入的內容。
// Import only foo.
import 'package:lib1/lib1.dart' show foo;
// Import all names EXCEPT foo.
import 'package:lib2/lib2.dart' hide foo;
庫的延遲加載
- 減少 APP 的啓動時間。
- 執行 A/B 測試,例如 嘗試各種算法的不同實現。
- 加載很少使用的功能,例如可選的屏幕和對話框。
//先使用 deferred as 關鍵字導入
import 'package:deferred/hello.dart' deferred as hello;
//使用時,使用 loadLibrary() 方法來加載庫
greet() async {
await hello.loadLibrary();
hello.printGreeting();
}
可以針對同一個庫多次調用loadLibrary() 方法,但是庫只會加載一次。
使用 await 關鍵字暫停代碼執行一直到庫加載完成。關於 async 和 await 的更多信息請參考異步支持。
需要注意
- 延遲加載庫的常量在導入的時候是不可用的。 只有當庫加載完畢的時候,庫中常量纔可以使用。
- 在導入文件的時候無法使用延遲庫中的類型。如果你需要使用類型,則考慮把接口類型移動到另外一個庫中,讓兩個庫都分別導入這個接口庫。
- Dart 隱含的把 loadLibrary() 函數導入到使用 deferred as 的命名空間中。 loadLibrary() 方法返回一個 Future。
實現庫
參考創建庫