库和导入

Last updated: ... / Reads: 42 Edit

import 和 library 指令可以帮助您创建模块化且可共享的代码库。库不仅提供 API,而且还是一个隐私单位:以下划线 ( _ ) 开头的标识符仅在库内部可见。每个 Dart 文件(及其部分)都是一个库,即使它不使用 library 指令。

可以使用包分发库。

如果你好奇为什么 Dart 使用下划线而不是 访问修饰符关键字(例如 public 或 private ),请参阅 SDK 问题 33383。

使用库

使用 import 指定如何在另一个库的作用域中使用一个库的命名空间。

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

import 'dart:html';

import 唯一需要的参数是指定库的 URI。对于内置库,URI 具有特殊的 dart: scheme。对于其他库,您可以使用文件系统路径或 package: schemepackage: 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;

// 使用 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;

延迟加载库

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

  • 减少 Web 应用的初始启动时间。
  • 执行 A/B 测试 - 例如,替代算法的实现。
  • 加载很少使用的功能,例如可选屏幕和对话框。

只有 dart 编译 js 支持延迟加载。Flutter 和 Dart VM 不支持延迟加载。 若要了解详细信息,请参阅问题 #33118 和问题 #27776。

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

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

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

Future<void> greet() async {
  await hello.loadLibrary();
  hello.printGreeting();
}

在前面的代码中, await关键字会暂停执行,直到加载库为止。有关 asyncawait 的更多信息,请参阅异步支持。 您可以在库上多次调用 loadLibrary() ,不会出现任何问题。该库仅加载一次。

使用延迟加载时,请记住以下几点:

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

library 指令

要指定库级文档注释或元数据注释,请将它们附加到文件开头的 library 声明。

/// 一个非常好的测试库。
@TestOn('browser')
library;

实现库

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

  • 如何组织库源代码。
  • 如何使用 export 指令。
  • 何时使用 part 指令。
  • 如何使用条件导入和导出来实现支持多个平台的库。

Comments

Make a comment