import和library指令可以帮助您创建模块化和可共享的代码库。库不仅提供api,而且包含隐私部分:以下划线(_)开头的标识符仅在库中可见。每个Dart应用程序都是一个库,即使它不使用库指令。

可以使用包来分发库。有关Pub Package和Asset Manager的信息,请参见[Pub Package和Asset Manager], Pub是SDK中包含的包管理器。

使用库

使用import来指定如何在另一个库的范围中使用来自一个库的命名空间。

例如,Dart web应用程序通常使用Dart:html库,它们可以这样导入:

  1. import 'dart:html';

导入一个库仅仅需要提供库的URI。对于内置库,URI具有特定的形式(dart:scheme)。对于其他库,可以使用文件路径或者包:scheme的形式。包:scheme形式指定包管理器(如pub工具)提供的库。例如:

  1. import 'package:test/test.dart';

注意:URI表示统一资源标识符。url(统一资源定位器)是一种常见的URI。

指定一个库前缀

如果您导入两个具有冲突标识符的库,那么您可以为一个或两个库指定一个前缀。例如,如果library1和library2都有一个Element类,那么你可以用以下的方法:

  1. import 'package:lib1/lib1.dart';
  2. import 'package:lib2/lib2.dart' as lib2;
  3. // Uses Element from lib1.
  4. Element element1 = Element();
  5. // Uses Element from lib2.
  6. lib2.Element element2 = lib2.Element();

只导入库的一部分

如果您只想使用库的一部分,您可以有选择地导入库。例如:

  1. // Import only foo.
  2. import 'package:lib1/lib1.dart' show foo;
  3. // Import all names EXCEPT foo.
  4. import 'package:lib2/lib2.dart' hide foo;

懒加载库

延迟加载(也称为懒加载)允许应用程序在需要时按需加载库。以下是一些您可能使用延迟加载的情况:

  • 减少应用程序的初始启动时间。
  • 例如,要执行A/B测试——尝试算法的其他实现。
  • 加载很少使用的功能,如可选屏幕和对话框。

要延迟加载库,必须首先使用deferred as进行导入。

  1. import 'package:greetings/hello.dart' deferred as hello;

当您需要库时,使用库的标识符调用loadLibrary()

  1. Future greet() async {
  2. await hello.loadLibrary();
  3. hello.printGreeting();
  4. }

在前面的代码中,wait关键字暂停执行,直到加载库。有关async和waiting的更多信息,请参见[异步支持]。
您可以在库上多次调用loadLibrary(),没有问题。该库只加载一次。
在使用延迟加载时,请记住以下几点:

  • 在导入文件中,递延库的常量不是常量。记住,这些常量在延迟库加载之前是不存在的。
  • 您不能在导入文件中使用来自延迟库的类型。相反,考虑将接口类型移动到由延迟库和导入文件导入的库。
  • Dart隐式地将loadLibrary()插入到您定义使用deferred作为名称空间的名称空间中。函数的作用是:返回一个未来。

Dart VM差异:由于问题#33118,Dart VM甚至在调用loadLibrary()之前就允许访问递延库的成员。我们希望这个bug能够很快得到修复,所以不要依赖于当前的VM行为。

库的实现

有关如何实现库包的建议,请参阅[创建库包],包括:

  • 如何组织库的代码。
  • 如何使用export指令。
  • 何时使用part指令。