[TOC]
import和library指令可以帮助您创建模块化和可共享的代码库。库不仅提供api,而且包含隐私部分:以下划线(_)开头的标识符仅在库中可见。每个Dart应用程序都是一个库,即使它不使用库指令。
可以使用包来分发库。有关Pub Package和Asset Manager的信息,请参见[Pub Package和Asset Manager], Pub是SDK中包含的包管理器。
## 使用库
使用import来指定如何在另一个库的范围中使用来自一个库的命名空间。
例如,Dart web应用程序通常使用Dart:html库,它们可以这样导入:
~~~
import 'dart:html';
~~~
导入一个库仅仅需要提供库的URI。对于内置库,URI具有特定的形式(dart:scheme)。对于其他库,可以使用文件路径或者包:scheme的形式。包:scheme形式指定包管理器(如pub工具)提供的库。例如:
~~~
import 'package:test/test.dart';
~~~
>注意:URI表示统一资源标识符。url(统一资源定位器)是一种常见的URI。
>
## 指定一个库前缀
如果您导入两个具有冲突标识符的库,那么您可以为一个或两个库指定一个前缀。例如,如果library1和library2都有一个Element类,那么你可以用以下的方法:
~~~
import 'package:lib1/lib1.dart';
import 'package:lib2/lib2.dart' as lib2;
// Uses Element from lib1.
Element element1 = Element();
// Uses Element from lib2.
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;
~~~
## 懒加载库
延迟加载(也称为懒加载)允许应用程序在需要时按需加载库。以下是一些您可能使用延迟加载的情况:
* 减少应用程序的初始启动时间。
* 例如,要执行A/B测试——尝试算法的其他实现。
* 加载很少使用的功能,如可选屏幕和对话框。
要延迟加载库,必须首先使用deferred as进行导入。
~~~
import 'package:greetings/hello.dart' deferred as hello;
~~~
当您需要库时,使用库的标识符调用loadLibrary()。
~~~
Future greet() async {
await hello.loadLibrary();
hello.printGreeting();
}
~~~
在前面的代码中,wait关键字暂停执行,直到加载库。有关async和waiting的更多信息,请参见[异步支持]。
您可以在库上多次调用loadLibrary(),没有问题。该库只加载一次。
在使用延迟加载时,请记住以下几点:
* 在导入文件中,递延库的常量不是常量。记住,这些常量在延迟库加载之前是不存在的。
* 您不能在导入文件中使用来自延迟库的类型。相反,考虑将接口类型移动到由延迟库和导入文件导入的库。
* Dart隐式地将loadLibrary()插入到您定义使用deferred作为名称空间的名称空间中。函数的作用是:返回一个未来。
>Dart VM差异:由于问题#33118,Dart VM甚至在调用loadLibrary()之前就允许访问递延库的成员。我们希望这个bug能够很快得到修复,所以不要依赖于当前的VM行为。
>
## 库的实现
有关如何实现库包的建议,请参阅[创建库包],包括:
* 如何组织库的代码。
* 如何使用export指令。
* 何时使用part指令。