指令 import 和 library 可以帮你创建一个模块化和可共享的代码库。库不仅提供 API,也是一个隐私单位:以下划线 (_) 开头的标识符只在库中可见。”每个 Dart 应用都是一个库“,即使它没有使用 library 指令。
库可以通过 包 来发布。
使用库
使用 import 指令来指定一个库在其他库的作用域内如何被使用。
比如,Dart 网页应用通常使用 dart:html 库,它可以像这样被引入:
import 'dart:html';
指令 import 唯一需要的参数是指定了这个库的 URI。对于内置库,URI 有特殊的 dart: 格式。对于其他更多的库,你可以使用一个文件系统路径或者 package: 格式。package: 格式指定由包管理器比如 pub 工具提供的库。比如:
import 'package:test/test.dart';
说明:URI 指统一资源标识符。URL (统一资源定位符)是一种常见的 URI。
指定库前缀
如果你导入两个有标识符冲突的库,那么你可以为其中一个或两个指定前缀。比如,如果库1和库2都有一个 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();
只导入一个库的部分
如果你只想要使用一个库的部分,你可以选择性地导入库。比如:
// 只导入 foo import 'package:lib1/lib1.dart' show foo; // 导入除 foo 之外的所有名称 import 'package:lib2/lib2.dart' hide foo;
懒加载一个库
”延迟加载“(也称为”懒加载“)允许一个 web 应用按需加载一个库,仅当这个库被需要时。下面是一些你可能会使用延迟加载的情况:
- 为了减少 web 应用的初始启动时间。
- 为了执行 A/B 测试——尝试一个算法的替代实现。
- 为了加载很少使用的功能,比如可选的页面和对话框。
说明:仅 dart2js 支持懒加载。Fultter 和 Dart VM,还有 dartdevc 不支持懒加载。要了解更多信息,请参阅 issue #33118 和 issue #27776。
要懒加载一个库,你必须先使用 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 namespace 定义的命名空间中。函数 loadLibrary() 返回一个 Future
实现库
要获取关于如何实现一个库包的建议,请参阅 创建一个库包,包括:
- 如果组织库中的源代码。
- 如果使用 export 指令。
- 何时使用 part 指令。
- 何时使用 library 指令。