库和可见性
创建一个模块化的,可共享的代码库可以用import 和 library 指令。 库不仅提供了 API ,而且对代码起到了封装的作用: 以下划线 (_) 开头的标识符仅在库内可见。,虽然没有使用 library 指令,但每个 Dart 应用程序都是一个库 。
库可以通过包来分发。
使用库
通过 import 在一个库中引用另外一个库的文件
例如,Dart Web应用程序通常使用 dart:html库,它们可以像这样导入:
import 'dart:html';
import 参数只需要一个指向库的 URI。URI 对于内置库拥有自己特殊的dart: 方案。 对于其他的库,使用系统文件路径或者 package: 方案 。 package: 方案指定由包管理器(如 pub 工具)提供的库。例如:
import 'package:test/test.dart';
URI是统一资源标识符。 URL(统一资源定位符)是一种常见的URI。
指定库前缀
导入两个存在冲突标识符的库, 可以为这两个库,或其中一个指定前缀。 如 library1 和 library2 都有一个 Element 类,可用下面的方式处理:
import 'package:lib1/lib1.dart';
import 'package:lib2/lib2.dart' as lib2;
// 使用 lib1 中的 Element。
Element element1 = Element();
// 使用 lib2 中的 Element。
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;
延迟加载库
让应用在需要的时候再加载库使用Deferred loading (也称 lazy loading) 。 下面是一些使用延迟加载库的场景:
- 减少 APP 的启动时间。
- 执行 A/B 测试,例如 尝试各种算法的 不同实现。
- 加载很少使用的功能,例如可选的屏幕和对话框。
用 deferred as 导入,延迟加载一个库:
import 'package:greetings/hello.dart' deferred as hello;
用库标识符调用 loadLibrary() 函数在需要时来加载库:
Future greet() async {
await hello.loadLibrary();
hello.printGreeting();
}
在前面的代码,使用 await 关键字暂停代码执行一直到库加载完成。
你可以在一个库上多次调用 loadLibrary() 函数。但它只载入一次。
注意:使用延迟加载库时:
只有库加载完毕的时候,库中常量才可以使用。延迟加载库的常量在导入的时候是不可用的。
如果你要使用类型,需把接口类型移动到另外一个库中, 让两个库都分别导入这个接口库。因为在导入文件的时候无法使用延迟库中的类型。
Dart 隐含的把 loadLibrary() 函数导入到使用 deferred as 的命名空间 中。 loadLibrary() 方法返回一个 Future。
Dart VM的区别:Dart VM允许在调用loadLibrary()之前访问延迟库的成员。这种行为可能会改变,所以不要依赖于当前的VM行为