Dart基礎--Libraries以及可見性

importlibrary 指定可以幫你創建一個模塊化以及可複用的代碼基礎。Libraries不僅可以提供APIs,也是一個私有單元:以下劃線開始的標識符僅僅在所在的 library 中可見。每一個 Dart 程序都是一個 library ,即使它沒有使用 library 指令。

可以使用 packages 來分發Libraries。

使用Libraries

使用 import 來指定一個 library 的命名空間如何在另一個 library 的範圍內使用。
例如,Dart web 應用程序通常需要使用 dart:html 庫,那麼可以像下面這樣導入:

import 'dart:html';

import 唯一必需的參數是指定庫URI。對於內置庫,它們的URI有一個指定的scheme: dart: 。對於其他庫,你可以使用文件系統路徑或者一個schema: package: 。 scheme package: 指定包管理器所提供的庫(Libraries),例如:

import 'package:test/test.dart';

指定庫的前綴

如果你導入兩個有標識符衝突的庫,此時你可以爲其中一個或者兩個都指定前綴。例如:如果 library1和library2都有一個 Element 類,你可能需要像下面的代碼這樣寫:

import 'package:lib1/lib1.dart';
import 'package:lib2/lib2.dart' as lib2;

// Uses Element from lib1.
Element element1 = Element();

// Uses Element from lib2.
lib2.Element element2 = lib2.Element();

僅僅導入庫的一部分

如果你想要使用一個庫的一部分,你可以有選擇性的導入一個庫。例如:

// 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:greetings/hello.dart' deferred as hello;

當你需要使用延遲加載的庫時,使用庫的標識符調用 loadLibrary() ,例如:

Future greet() async {
  await hello.loadLibrary();
  hello.printGreeting();
}

在上面的代碼中,關鍵字 await 會暫停代碼的執行直到庫被加載完成。更多關於 async await 的信息,請看asynchrony support

你可以調用在一個庫上多次調用 loadLibrary() ,這是不會有問題的,該庫僅僅會被加載一次。

當你使用延遲加載一個庫時,請牢記如下幾點:

  • 一個延遲加載的庫的常量在導入該庫的文件中並不屬於常量。記住,這些常量是不存在的,直到延遲加載庫被加載完成。
  • 你不能在導入庫的文件中使用延遲庫中的類型。Instead, consider moving interface types to a library imported by both the deferred library and the importing file.
  • Dart隱式的將 loadLibrary() 插入到你使用 deferred as namespace 定義的命名空間中。

實現庫

如何實現一個庫請參考 Create Library Package,包含如下幾點:

  • 如何組織庫的源代碼
  • 如何使用 export 指令
  • 何時使用 part 指令
  • 何時使用 library 指令
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章