### 庫和可見性
1. import,part,library指令可以幫助創建一個模塊化的,可共享的代碼庫。庫不僅提供了API,還提供隱私單元:以下劃線(\_)開頭的標識符只對內部庫可見。每個Dartapp就是一個庫,即使它不使用庫指令。
2. 庫可以分布式使用包。見[Pub Package and Asset Manager](https://www.dartlang.org/tools/pub/)中有關pub(SDK中的一個包管理器)。
3. ***使用庫***
* 使用 import 來指定如何從一個庫命名空間用于其他庫的范圍。
* 例如,Dart Web應用一般采用這個庫 dart:html,可以這樣導入:
~~~
import 'dart:html';
~~~
* 唯一需要 import 的參數是一個指向庫的 URI。對于內置庫,URI中具有特殊dart:scheme。對于其他庫,你可以使用文件系統路徑或package:scheme。包 package:scheme specifies libraries ,如pub工具提供的軟件包管理器庫。例如:
~~~
import 'dart:io';
import 'package:mylib/mylib.dart';
import 'package:utils/utils.dart';
~~~
4. ***指定庫前綴***
* 如果導入兩個庫是有沖突的標識符,那么你可以指定一個或兩個庫的前綴。例如,如果 library1 和 library2 都有一個元素類,那么你可能有這樣的代碼:
~~~
```
import 'package:lib1/lib1.dart';
import 'package:lib2/lib2.dart' as lib2;
// ...
var element1 = new Element(); // 使用lib1里的元素
var element2 =
new lib2.Element(); // 使用lib2里的元素
```
~~~
5. ***導入部分庫***
* 如果想使用的庫一部分,你可以選擇性導入庫。例如:
~~~
// 只導入foo庫
import 'package:lib1/lib1.dart' show foo;
//導入所有除了foo
import 'package:lib2/lib2.dart' hide foo;
~~~
6. ***延遲加載庫***
* 延遲(deferred)加載(也稱為延遲(lazy)加載)允許應用程序按需加載庫。下面是當你可能會使用延遲加載某些情況:
* 為了減少應用程序的初始啟動時間;
* 執行A / B測試-嘗試的算法的替代實施方式中;
* 加載很少使用的功能,例如可選的屏幕和對話框。
* 為了延遲加載一個庫,你必須使用 deferred as 先導入它。
~~~
import 'package:deferred/hello.dart' deferred as hello;
~~~
* 當需要庫時,使用該庫的調用標識符調用 LoadLibrary()。
~~~
greet() async {
await hello.loadLibrary();
hello.printGreeting();
}
~~~
* 在前面的代碼,在庫加載好之前,await關鍵字都是暫停執行的。有關 async 和 await 見 asynchrony support 的更多信息。
* 您可以在一個庫調用 LoadLibrary() 多次都沒有問題。該庫也只被加載一次。
* 當您使用延遲加載,請記住以下內容:
* 延遲庫的常量在其作為導入文件時不是常量。記住,這些常量不存在,直到遲庫被加載完成。
* 你不能在導入文件中使用延遲庫常量的類型。相反,考慮將接口類型移到同時由延遲庫和導入文件導入的庫。
* Dart隱含調用LoadLibrary()插入到定義deferred as namespace。在調用LoadLibrary()函數返回一個Future。
7. ***庫的實現***
* 用 library 來來命名庫,用part來指定庫中的其他文件。 注意:不必在應用程序中(具有頂級main()函數的文件)使用library,但這樣做可以讓你在多個文件中執行應用程序。
8. ***聲明庫***
* 利用library identifier(庫標識符)指定當前庫的名稱:
~~~
// 聲明庫,名ballgame
library ballgame;
// 導入html庫
import 'dart:html';
// ...代碼從這里開始...
~~~
9. ***關聯文件與庫***
* 添加實現文件,把part fileUri放在有庫的文件,其中fileURI是實現文件的路徑。然后在實現文件中,添加部分標識符(part of identifier),其中標識符是庫的名稱。下面的示例使用的一部分,在三個文件來實現部分庫。
* 第一個文件,ballgame.dart,聲明球賽庫,導入其他需要的庫,并指定ball.dart和util.dart是此庫的部分:
~~~
library ballgame;
import 'dart:html';
// ...其他導入在這里...
part 'ball.dart';
part 'util.dart';
// ...代碼從這里開始...
~~~
* 第二個文件ball.dart,實現了球賽庫的一部分:
~~~
part of ballgame;
// ...代碼從這里開始...
~~~
* 第三個文件,util.dart,實現了球賽庫的其余部分:
~~~
part of ballgame;
// ...Code goes here...
~~~
10. ***重新導出庫(Re-exporting libraries)***
~~~
* 可以通過重新導出部分庫或者全部庫來組合或重新打包庫。例如,你可能有實現為一組較小的庫集成為一個較大庫。或者你可以創建一個庫,提供了從另一個庫方法的子集。
```
// In french.dart:
library french;
hello() => print('Bonjour!');
goodbye() => print('Au Revoir!');
// In togo.dart:
library togo;
import 'french.dart';
export 'french.dart' show hello;
// In another .dart file:
import 'togo.dart';
void main() {
hello(); //print bonjour
goodbye(); //FAIL
}
```
~~~