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。

實現庫

參考創建庫

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章