简介
dart 中,库(library)就是具有特定功能的模块,类似于 js 中的包。一个 dart 文件就可以是一个库,一个库也可以包含多个文件。库可以分为三类:系统库、自定义库和第三方库,下面分别做更具体的介绍。
系统库
如果想使用一些系统库,就需要先导入再使用,导入的方式为 import 'dart:库名';
,比如使用 math 库:
dart
import 'dart:math';
void main() {
print(e); // 2.718281828459045
}
之所以可以打印得到数学常数 e,是因为在 math.dart 中定义了该常量:
下面解释下上图中出现的其它一些内容:
library dart.math;
:使用library
来显示地声明库的名称,库名建议使用小写字母 + 下划线的形式;import "dart:_internal" show SystemHash;
:show
代表部分引入,即只引入了 dart._internal 这个库中的SystemHash
,做到了按需引入。相对的,如果把show
替换成hide
,则意味着隐藏一个库中某些内容;part "point.dart";
:part
用于和子库建立联系,代表在 dart.math 库中,引入了 point.dart 这个库,在其它地方引入了 dart.math,就可以同时使用 point.dart 的公共内容了。相对应的,在 point.dart 中也需要使用part of
来与主库建立联系,of
后的内容即为主库library
声明的库名称:
使用 part
和 part of
会比较麻烦,所以现在建议直接在主库使用 export
其它子库即可。比如 flutter 项目中,material 库中使用的就是 export
:
核心库
系统库中的核心库则无需显示地导入,比如我们要创建个列表,尽管我们没有定义过 List.empty
, 却可以直接 final l = List.empty(growable: true);
,是因为 List
定义于 dart 系统库中的核心库 dart:core,会被默认引入,而不需要特地写出来import 'dart:core';
。
除了上面介绍的 dart:core 和 dart:math,更多系统库可参见官方文档。
自定义库
引入自定义库的方式为 import '库的位置/库名.dart';
。比如我们在 lib 目录下定义了个 utils/my_math.dart,里面有个 add
函数:
dart
// lib/utils/my_math.dart
library my_math; // 一般省略
num add(num num1, num num2) {
return num1 + num2;
}
然后就可以在其它文件引入 my_math 使用了,引入时路径可以用绝对路径,也可以像下面这样写,相当于是相对路径:
dart
// lib/test.dart
import 'utils/my_math.dart';
void main() {
print(add(1, 2)); // 3
}
如果担心引入的库的属性或方法之间有重名,可以使用 as
来给库起别名:
dart
import 'utils/my_math.dart' as myMath;
void main() {
print(myMath.add(1, 2)); // 3
}
第三方库
就像 node 项目安装第三方包需要 package.json 一样,dart 中使用第三方库需要创建 pubspec.yaml,yaml 是一种文件格式,主要是以缩进的方式来实现上下级代码的分割。我们可以在 pub.dev 上查看可以安装的第三方库(类似于 node 的 npmjs):
然后将想要安装的库在 pubspec.yaml 中的 dependencies
或 dev_dependencies
声明,比如要安装 http 库:
yaml
name: dart
description: A new Dart project.
environment:
sdk: '>=3.0.2 <4.0.0'
dependencies:
http: ^1.0.0
保存文件时 vscode 就会自动帮我们安装第三方包了:
如果想手动安装可以在 pubspec.yaml 所在的目录执行命令 dart pub get
:
下载下来的包会放在系统缓存中,而不是像 node 项目那样会有个 node_modules 目录,比如我电脑上 http 就被放在了 AppData\Local\Pub\Cache\hosted\pub.flutter-io.cn\http-1.0.0:
安装成功后会看到新生成一个 pubspec.lock 文件,起的作用类似于 node 项目中使用 npm 时的 package-lock.json 文件,记录着库的版本等信息。还会生成一个 .dart_tool\package_config.json 文件,里面记录着库文件的位置等信息。
在项目中引入已安装的第三方库的方法为 import 'package:xxx/xxxxx.dart';
比如引入 http 就是:
dart
import 'package:http/http.dart';