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库的一部分。