Flutter 基础之 Dart 中的库

简介

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';

相关推荐
SoaringHeart5 小时前
Flutter 查缺补漏:@JsonKey 属性全解,让模型层不再被后端字段牵着走
flutter
恋猫de小郭18 小时前
Flutter 可以更直接地调用原生 API 了,Dart Direct Native Interop
android·前端·flutter
码点18 小时前
二.Flutter 速成第二课:核心概念与第一个自定义页面
flutter
好的佩奇1 天前
蓝牙之通信架构
android·flutter·蓝牙
yujunlong39192 天前
[特殊字符] Serverpod 4.1.0 全栈项目开发与 Docker 部署规范文档
flutter·docker·serverpod
FungLeo2 天前
成为全栈·Go 后端篇·换后端不改前端:四个客户端如何做兼容回归
flutter·golang·go·成为全栈·兼容测试·taro 小程序
恋猫de小郭2 天前
Flutter Android 性能修复:8 个大核的手机,Raster 居然只跑在 2 个核上?
android·flutter
恋猫de小郭3 天前
感人,Flutter 居然有了一个超实用提案,期待落地
android·前端·flutter
好的佩奇3 天前
Dart 之增强枚举
android·flutter·dart
好的佩奇3 天前
蓝牙之无线电与通信距离
android·flutter·蓝牙