flutter【9】dart語言--庫和可見性
庫和可見性
- 每個 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。
實現庫
參考建立庫