import
,part
,library
指令可以幫助創(chuàng)建一個模塊化的蒲犬,可共享的代碼庫困食。庫不僅提供了API蛇尚,還提供隱私單元:以下劃線_
開頭的標識符只對內部庫可見。每個Dartapp就是一個庫弛车,即使它不使用庫指令。
- 庫可以分布式使用包蒲每。
- 使用庫
使用
import
來指定如何從一個庫命名空間用于其他庫的范圍纷跛。-
唯一需要
import
的參數(shù)是一個指向庫的 URI。對于內置庫邀杏,URI中具有特殊dart:scheme
贫奠。對于其他庫,你可以使用文件系統(tǒng)路徑或package:scheme
望蜡。包package:scheme specifies libraries
唤崭,如pub工具提供的軟件包管理器庫。例如:import 'dart:io'; import 'package:mylib/mylib.dart'; import 'package:utils/utils.dart';
- 指定庫前綴
-
如果導入兩個庫是有沖突的標識符脖律,那么你可以指定一個或兩個庫的前綴谢肾。例如,如果 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里的元素
- 導入部分庫
- 如果想使用的庫一部分勒叠,你可以選擇性導入庫。例如:
// 只導入foo庫 import 'package:lib1/lib1.dart' show foo; //導入所有除了foo import 'package:lib2/lib2.dart' hide foo;
- 延遲加載庫
-
延遲(deferred)加載(也稱為延遲(lazy)加載)允許應用程序按需加載庫膏孟。下面是當你可能會使用延遲加載某些情況:
- 為了減少應用程序的初始啟動時間眯分;
- 執(zhí)行A / B測試-嘗試的算法的替代實施方式中;
- 加載很少使用的功能柒桑,例如可選的屏幕和對話框弊决。
-
為了延遲加載一個庫,你必須使用 deferred as 先導入它魁淳。
import 'package:deferred/hello.dart' deferred as hello;
-
當需要庫時飘诗,使用該庫的調用標識符調用
LoadLibrary()
。greet() async { await hello.loadLibrary(); hello.printGreeting(); }
在前面的代碼界逛,在庫加載好之前昆稿,
await
關鍵字都是暫停執(zhí)行的。有關async
和await
見asynchrony support
的更多信息息拜。您可以在一個庫調用
LoadLibrary()
多次都沒有問題溉潭。該庫也只被加載一次净响。-
當您使用延遲加載,請記住以下內容:
- 延遲庫的常量在其作為導入文件時不是常量喳瓣。記住馋贤,這些常量不存在,直到遲庫被加載完成畏陕。
- 你不能在導入文件中使用延遲庫常量的類型配乓。相反,考慮將接口類型移到同時由延遲庫和導入文件導入的庫惠毁。
- Dart隱含調用
LoadLibrary()
插入到定義deferred as namespace
犹芹。在調用LoadLibrary()
函數(shù)返回一個Future
。
- library
- 用
library
來來命名庫鞠绰,用part
來指定庫中的其他文件羽莺。 注意:不必在應用程序中(具有頂級main()
函數(shù)的文件)使用library
,但這樣做可以讓你在多個文件中執(zhí)行應用程序洞豁。
- 聲明庫
- 利用library identifier(庫標識符)指定當前庫的名稱:
// 聲明庫盐固,名ballgame library ballgame; // 導入html庫 import 'dart:html'; // ...代碼從這里開始...
- 庫的拆分
添加實現(xiàn)文件,把
part fileUri
放在有庫的文件丈挟,其中fileURI
是實現(xiàn)文件的路徑刁卜。然后在實現(xiàn)文件中,添加部分標識符part of identifier
曙咽,其中標識符是庫的名稱蛔趴。下面的示例使用的一部分,在三個文件來實現(xiàn)部分庫例朱。-
第一個文件孝情,ballgame.dart,聲明球賽庫洒嗤,導入其他需要的庫箫荡,并指定ball.dart和util.dart是此庫的部分:
library ballgame; import 'dart:html'; // ...其他導入在這里... part 'ball.dart'; part 'util.dart'; // ...代碼從這里開始...
-
第二個文件ball.dart,實現(xiàn)了球賽庫的一部分:
part of ballgame; // ...代碼從這里開始...
-
第三個文件渔隶,util.dart羔挡,實現(xiàn)了球賽庫的其余部分:
part of ballgame; // ...Code goes here...
- export
- 可以通過重新導出部分庫或者全部庫來組合或重新打包庫。例如间唉,你可能有實現(xiàn)為一組較小的庫集成為一個較大庫绞灼。或者你可以創(chuàng)建一個庫呈野,提供了從另一個庫方法的子集低矮。
// 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 }