认识 Dart 的库概念
Dart 库就是一个 library,是一个模块化的、可共享的代码库。
Dart 库可以包含一组 import, export 和顶级声明。顶级声明可以是类、类型别名、函数或变量声明。
1 | topLevelDefinition: |
库的访问权限
与其他的编程语言不同的是,Dart 语法中不存在 public, private 和 protected 的关键字。成员标志符如果以下划线(_)开头可以将成员进行私有声明,库内部的私有声明只能为通过库内部的代码进行访问。
由于顶级私有声明不会被导入,因此也不能被另一个库中使用。特别地对于任意的库,总是隐式地导入了 dart:core。
库 L 的公共命名空间(包含的为库的可用对象)是一组映射,该映射将库 L 的每个公共顶级成员 m 的名称映射到成员 m。而库 L 的范围则包括了库中所有顶级声明的成员名称以及该库的引入(import);
Dart 库的命名
开发者可以隐式或者显示地命名一个 Dart 库。
- 显示命名 Dart 库:使用 library 关键字提供标识符和点的级联来为库命名。
- 隐式命名 Dart 库:使用空字符串作为库的名称。
import :导入 Dart 库
import 允许将另一个库的非私有内容重用到当前文件。通常来说,import 语句以 URI (Uniform Resource Identifier)字符串来定位一个库的位置。
1 | import 'dart:core'; |
- 使用 import as 来解决库内容的歧义冲突。
假设两个需要导入的库当中存在两个同名的成员,这时编译器就无法区分开发者的意图了。对于这一问题,Dart 的解决方式与 Python 类似,可以使用 import as 语句在导入库时对不同的库使用不同的标志符进行区分。
1 | // Assume that both package own a doSomething method. |
- 使用 import hide/show 来导入部分库成员
如果开发者只需要导入部分库成员,那么可以使用显式地指定导入过程中需要部分导入或屏蔽的成员。
1 | // Import only foo. |
part 拆分 Dart 库
通常来讲一个库的内容很庞大,将一个庞大的代码库进行一定的分割是很有必要的,我们就会使用一对 part 命令来对 Dart 库进行分解。从 Dart 的官方文档看来, part 命令在后续的时间会被取代,不建议开发者使用。
part 命令是成对存在的,library 主文件中使用 part 指定一个 URI 来存放库的子系统的 dart 文件,相应地对应的 dart 文件也使用 part of library_name 来现实指定其归属的库。
export 导出部分内容
开发者可以通过 export 命令显式的将一部分库内容导出为库的公共 API,事实上这种方法应当尽可能取代 part 命令成为库管理的方式。
1 | export 'src/cascade.dart'; |
deferred as 延迟加载 Dart 库
通常来讲 Dart 库在编译初期就会加载,这对于应用启动初期内存使用可能是一个负担。Dart 中的解决方法是延迟加载。
使用 deferred as 为 import 指定一个需要延迟加载的库标志符,并在需要加载库的时候再使用异步函数显式地加载一个 Dart 库。
1 | import 'package:greetings/hello.dart' deferred as hello; |