Dart以库(library)的方式来组织代码。


我们可以导入一个库,也可以编写一个库以供别人重用。关键字import用于导入库,关键字library用于定义库,关键字part表明当前库包含另外的文件,而part of表明当前文件是某库的一部分。


一、导入标准库

导入库的格式为:

// 伪代码
import 库路径;

其中“库路径”是一个字符串。对于标准库而言,库路径一定以“dart:”开头。

例如,导入标准库中的数学库并调用里面的函数:

import "dart:math"; // 导入 math 库

void main() {
  double y = cos(PI); // cos是math库中的函数,PI是math库中的常量
  print(y); // -1.0
}

导入一个库之后,库中的公有变量、函数等就可以被使用了。不过,这样做很有可能造成符号的污染:库中的符号与你代码中的符号可能重名。上面的例子中,你的代码中也可能有一个名为cos的函数。为库设置前缀可以解决这个问题。

import "dart:math" as math;

void main() {
  double y = math.cos(math.PI);
  print(y);
}

上面的例子中,为dart:math这个库设置的前缀math,这样一来,这个库中的符号只能通过前缀来访问。

如果我们希望只导入库的一部分,可以利用show、hide来实现。

// 只导入 dart:io 的 BytesBuilder
import "dart:io" show BytesBuilder;

// 导入  dart:async 的除 Stream 以外的部分
import "dart:async" hide Stream;


二、访问权限

如果一个符号以下划线“_”开头,那么这个符号是私有的,否则是公有的。

值得注意的是,Dart的私有、公有是针对库而言的,而不是针对类。

即使类中的成员或方法以_开头,同一库中其他地方也可以访问它们。


三、编写自己的库

定义一个库,要用到关键字library:

// 文件 mpeg.dart
library mpeg;

void Func() {
  print("FFmpeg");
}

导入自定义的库也用import:

import "mpeg.dart" as ffmpeg;

void main() {
  ffmpeg.Func();
}

导入自定义的库,库路径直接填.dart文件的路径。

上面的例子中,我们给这个库加了一个前缀。


四、part与part of

在大型项目中,一个库不太可能只有一个文件,这时便需要将库的代码写在多个文件中,这样,不管是阅读还是维护都比较方便。

假设,我需要编写一个播放音频的库audio。那么我可以编写3个文件:

audio.dart
core.dart
lrc.dart

audio.dart内容如下:

library audio; // 定义一个库

// part语句指出,下面2个文件是这个库的一部分
part "lrc.dart";
part "core.dart";

core.dart内容如下:

part of audio;

void Func1() {
  _Func2();
}

void _Func2() {}

lrc.dart内容如下:

audio;

Func3() {
  ;
}

String Func4() {
  ;
}

这两个文件中的part of语句指出,它们是audio库的一部分。