库与可见性

(library)是 Dart 代码的逻辑组织单元,是可见性(访问控制)的实现基础,使用库能够使代码模块化且便于复用。

注意:通过librarypart关键字,一个库是可以由多个 Dart 文件组成的,但因为官方不再推荐此方式,所以这里不做讲解。

一个 Dart 应用包含多个 Dart 文件,每个 Dart 文件就是一个库,每个库都有对应的URI(统一资源标识符)。

库的 URI 有三种书写形式:

  1. dart:开头的 Dart 自带的标准库,如:dart:io,dart:async
  2. 文件路径形式,如:’../base.dart’
  3. package:开头的URI(需要包管理器pub的支持,将在后续章节讲解)

库的导入是通过import关键字加库的 URI 来实现,应用自身的库一般通过文件路径形式相互导入,外部引入的库使用形式URI导入。

  1. // 三种形式的库导入
  2. import dart:io;
  3. import '../base.dart';
  4. import 'package:test/test.dart';

可见性

在可见性或者说访问控制方面,很多语言都有相对复杂的实现,如 Java/C# 中,有public等多个关键字来声明变量的访问权限,而 Dart 的可见性设计则非常简洁。

Dart 应用由多个库组成,库中又包含了类、函数和变量等,它们都是库的成员,对外默认可见(可以被其他库导入使用)。如果库成员的标识符是以_(下划线)开头,则它是库私有的,对外不可见。

默认情况下,import会将库中所有成员(私有成员除外)导入到当前代码中,如果想隐藏某些成员,或者只想导入某些成员,则可以使用hideshow关键字。

在导入多个库时,不同库中的成员可能会重名,导致代码无法编译,解决方法是使用as给库添加前缀,库成员将通过前缀.成员名称方式访问。

  1. // lib1.dart
  2. class _Base {
  3. }
  4. class Class1 extends _Base {
  5. }
  6. class Class2 extends _Base {
  7. }
  8. // lib2.dart
  9. class Class1 {
  10. }
  11. class Class2 {
  12. }
  13. // main.dart
  14. import 'lib1.dart' hide Class2; // 隐藏lib1中的Class2
  15. import 'lib2.dart' as lib2 show Class1; // 只导入lib2的Class1,同时添加库前缀lib2,避免Class1命名冲突
  16. main() {
  17. // var base = _Base(); // 错误,无法访问lib1的私有成员
  18. var cls1 = Class1(); // 访问lib1的Class1
  19. var cls2 = lib2.Class1(); // 通过前缀访问lib2中的Class1
  20. }

标准库

与其他语言一样,Dart 自带处理常见任务的库,即标准库。Dart 的标准库由核心库dart:core及其他17个库组成。

dart:core是 Dart 的核心库,其中包含最基础最常用的类型,如:int,List 等。dart:core会隐含导入到代码中,无需使用import导入(显式导入dart:core反而会报错)。

除核心库外的其他库,按照适用平台,划分为三类:

  1. 通用库,可适用于服务端和Web端;
  2. 仅适用于服务端(VM)
  3. 仅适用于Web端
库名 适用平台 描述
dart:async 通用 异步编程库,包含FutureStream等常用异步编程类型
dart:collection 通用 集合支持/工具库,对dart:core中的集合类型(ListMap等)提供补充
dart:convert 通用 转换库,用于对各种数据格式的编码/解码,如:jsonutf8
dart:developer 通用 开发者库,提供开发者工具,如:debuggerinspector
dart:math 通用 数学库,提供各种数学运算相关函数
dart:typed_data 通用 高效、固定长度的列表类型库
dart:io VM io库,提供文件、Socket等常见io操作类
dart:isolate VM 并发编程支持库
dart:mirrors VM 反射库(API不稳定)
dart:html Web html库,提供对html元素和dom的操作等
dart:indexed_db Web Web端indexed_db数据库支持库
dart:js Web JavaScript库,支持对JavaScript对象/方法的访问
dart:js_util Web JavaScript交互工具库
dart:svg Web svg矢量图形支持库
dart:web_audio Web Web端音频处理库
dart:web_gl Web Web端3D编程支持库
dart:web_sql Web Web端SQL支持库(标准过时,推荐使用dart:indexed_db代替)