库与可见性

(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. classClass1extends_Base{
  5. }
  6. classClass2extends_Base{
  7. }
  8. // lib2.dart
  9. classClass1{
  10. }
  11. classClass2{
  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:ioVMio库,提供文件、Socket等常见io操作类
dart:isolateVM并发编程支持库
dart:mirrorsVM反射库(API不稳定)
dart:htmlWebhtml库,提供对html元素和dom的操作等
dart:indexed_dbWebWeb端indexed_db数据库支持库
dart:jsWebJavaScript库,支持对JavaScript对象/方法的访问
dart:js_utilWebJavaScript交互工具库
dart:svgWebsvg矢量图形支持库
dart:web_audioWebWeb端音频处理库
dart:web_glWebWeb端3D编程支持库
dart:web_sqlWebWeb端SQL支持库(标准过时,推荐使用dart:indexed_db代替)