库和可见性
- 每个 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。
实现库
参考创建库