Dart 速查 — 简明参考
Dart 3 语法、类型系统、异步与最常用标准库速查手册,覆盖约 80% 日常场景。
Dart Dart 3
Dart SDK · OO · 泛型 · 函数式 · 异步优先 · 静态(健全空安全)
学习路径
先学会 dart create/run 与 pubspec 包结构 → 掌握变量、类型与流程控制 → 深入函数、字符串与集合 → 理解类、mixin 与错误处理 → 用 isolate 与 async/await 写并发 → 再按需学网络、时间、进程、正则与构建测试。FAQ 节适合回头避坑。
1.Hello World 与运行环境
最小程序、dart create/run 与项目结构。
最小程序
每个 Dart 程序从 void main() 入口函数开始。dart run 会执行它,print 输出到标准输出。
创建与运行
dart create 生成标准项目骨架,dart run 直接运行入口文件。开发期 JIT 热重载,发布时 AOT 编译。
项目结构
pubspec.yaml 声明包名、依赖与 SDK 版本。代码放在 lib/ 与 bin/,测试放在 test/。
打印输出
print 输出到 stdout 并追加换行。$ 插值把变量嵌入字符串,${表达式} 用于复杂形式。
命令行参数
main 可接收 List<String> args 参数。args[0] 起是命令行传入的实参,不含程序名。
异步主函数
main 可以是 Future<void>,程序会等待所有 await 完成后再退出。异步操作常用于耗时任务。
注释
// 单行注释、/// 文档注释(生成 API 文档)、/* */ 块注释。注释不影响运行。
顶层成员
Dart 允许顶层函数与变量(不在类里)。import 导入库,顶层变量在文件间共享。
2.变量与常量
变量声明、final/const、空安全与解构。
var 与 final
var 声明可重新赋值但类型推断固定。final 声明只能赋值一次,赋值后不可改。
const 常量
const 是编译期常量,必须在编译时能确定值。const 值会规范化,同一常量只存一份。
显式类型
可显式标注类型声明变量。静态类型帮助编译期检查,公共 API 建议显式标注。
可空变量
健全空安全下默认不可为 null。类型后加 ? 声明可空,使用前判空或用 ?? 给默认值。
late 延迟初始化
late 延迟到首次访问时才初始化。late final 只能赋值一次,适合依赖运行时环境的字段。
解构赋值
Dart 3 支持记录与模式解构,把集合元素一次性赋给多个变量。解构必须匹配形状。
作用域与遮蔽
变量在声明它的块内可见,内层可以遮蔽外层同名变量。顶层变量整个库可见。
dynamic 与 Object
dynamic 跳过静态检查,类型在运行时决定。Object 要求静态类型检查,需显式转换。
3.数据类型
内置类型、集合类型、记录与枚举。
数值类型
int 是整数,double 是浮点数,num 是二者的父类型。整数字面量可赋给 double。
字符串类型
String 是不可变 UTF-16 序列。单引号双引号等价,支持插值与多行文本。
布尔类型
bool 只有 true 和 false。条件表达式必须返回 bool,不会隐式转换数字。
列表类型
List 是有序集合,支持泛型。字面量 [a, b] 创建列表,默认可增长。
集合与映射
Set 是无序不重复集合,Map 是键值对映射。二者都有泛型版本与字面量语法。
记录类型
Dart 3 的 record 是无名字的轻量聚合类型。可带字段名,可配合模式解构。
枚举
enum 定义有限的命名常量集合。增强枚举(Dart 2.17+)可带字段与方法。
类型转换
int.parse / double.parse 把字符串转数值,toString 转回字符串。as 做运行时类型转换。
4.引用与空安全
对象引用、null 安全、深拷贝与原生内存。
对象引用
Dart 没有裸指针,变量保存的是对象引用。赋值只复制引用,多个变量可指向同一对象。
空安全
健全空安全让 null 只能出现在可空类型 String? 中。编译器在编译期保证非空安全。
非空断言 !
在可空表达式后加 ! 断言其非空,断言失败抛出空指针异常。只在确实非空时用。
空合并
?? 在左侧为 null 时取右侧默认值。??= 在变量为 null 时才赋值。
late 与 const
final 运行时一次性赋值,const 编译期常量。late 延迟初始化适合大对象与循环依赖。
引用与相等
== 默认比较引用,identical() 判断是否同一对象。需要结构相等时用工具函数。
深浅拷贝
浅拷贝只复制顶层,深层对象仍共享。深拷贝需逐层复制,不可变集合天然安全共享。
原生内存
dart:ffi 提供 Pointer 与 calloc 访问原生内存,用于与 C 库互操作。指针生命周期需开发者管理。
5.流程控制
if、循环、switch 与模式匹配。
if / else
if/else if/else 按条件分支执行。条件必须是 bool,可空判断会触发类型提升。
三元表达式
条件 ? 真值 : 假值 是单表达式分支。与 ?? 配合处理可空默认值。
for 循环
for 经典三段式循环,for-in 遍历可迭代对象。Dart 3 支持循环内模式解构。
while 循环
while 先判断再执行,do-while 至少执行一次再判断。适合未知次数的循环。
switch 表达式
Dart 3 的 switch 表达式返回一个值。case 后是模式,=> 给出结果,无需 break。
switch 语句
switch 语句按 case 执行分支。支持空 case 穿透、守卫与模式。每个非空分支要 break。
模式匹配
if-case 与 switch 可对值做结构匹配。对象模式、记录模式与守卫组合使用。
break 与 continue
break 退出当前循环,continue 跳到下一轮。标签可控制嵌套循环的跳转目标。
6.函数与 Lambda
函数定义、可选参数、闭包与异步函数。
函数定义
函数由返回类型、名称、参数与函数体构成。无返回值的函数用 void。
箭头函数
单表达式函数体可用 => 简写,返回该表达式的值。适合纯函数与回调。
可选位置参数
方括号 [] 声明可选位置参数,未传时用默认值或为 null。默认值必须是编译期常量。
命名参数
花括号 {} 声明命名参数,调用时按名传值。required 强制必须传入。
高阶函数
函数是一等公民,可作参数传入或作为返回值。map/where/fold 是集合的常用高阶函数。
闭包
闭包捕获定义环境中的变量。即使外层函数已返回,闭包仍能访问与修改这些变量。
异步函数
async 函数返回 Future,内部用 await 等待异步结果。await 只能用于 async 函数。
生成器
sync* 生成惰性 Iterable,async* 生成 Stream。yield 每次产出一个值,yield* 委托另一个生成器。
7.字符串
字面量、插值、子串、编码与格式化。
字符串字面量
单引号与双引号都表示字符串。可用反斜杠转义特殊字符,r 前缀表示原始字符串。
字符串插值
$变量 与 ${表达式} 把值嵌入字符串。任何对象都会调用 toString。
多行字符串
三个单引号 ''' 创建多行字符串,保留换行与缩进。适合长文本与模板。
常用方法
contains/hasPrefix 判断包含,replaceAll 替换,toUpperCase/toLowerCase 转换大小写。
子串与查找
substring 按索引截取,indexOf 查找子串位置,split 按分隔符拆分成列表。
字符与编码
Dart 字符串是 UTF-16 序列,codeUnits 给编码单元,runes 给码点。处理 emoji 需 runes。
高效拼接
循环拼接字符串会创建大量临时对象。StringBuffer 先累积再一次性转成字符串。
格式化与解析
toStringAsFixed 固定小数位,padLeft 补位,int.parse/double.parse 解析数字字符串。
8.集合
列表、映射、集合运算与排序。
列表操作
add 追加、insert 插入、remove 删除、sort 排序。默认 List 可变且可增长。
列表高阶
map 变换、where 过滤、reduce/fold 聚合、expand 展平。返回的 Iterable 多为惰性。
展开运算符
... 展开一个集合的元素并入字面量。...? 在源为 null 时安全跳过。
集合内 if/for
集合字面量内可用 if 条件包含元素,用 for 批量生成元素。Dart 3 还支持模式解构。
映射操作
Map 的键、值、条目可迭代。putIfAbsent 惰性填充,update 更新,remove 删除。
集合操作
Set 保证元素唯一。union/intersection/difference 做集合运算,toSet 从列表去重。
排序与查找
sort 默认升序,可传比较器。indexOf 线性查找,contains 判断存在。
只读集合
List.unmodifiable 创建只读列表,修改抛 UnsupportedError。List.of 复制可变列表。
9.内存与性能
垃圾回收、const 规范化与缓冲复用。
垃圾回收
Dart VM 自动垃圾回收,无需手动释放内存。对象不再被引用后会被回收。
const 规范化
const 值会被规范化,相同常量只存在一份。使用 const 减少重复分配。
惰性初始化
顶层与静态变量是懒初始化,首次访问才赋值。late 提供同样的延迟语义。
列表容量
可变列表按需扩容,频繁 add 会多次重新分配。已知大小建议预分配。
缓冲复用
Uint8List 等 typed data 适合二进制缓冲。复用缓冲避免反复分配,StringBuffer 拼接字符串。
弱关联
Expando 在不修改对象的前提下附加数据,键是弱引用。WeakReference 不阻止对象回收。
对象生命周期
对象在 isolate 独立堆中创建。isolate 间无法共享可变对象,只能复制或消息传递。
原生内存
与 C 互操作时用 dart:ffi 分配原生内存。指针必须手动释放,否则内存泄漏。
10.面向对象
类、继承、mixin 与接口。
类与构造
class 定义对象蓝图。构造器与类同名,this 参数把参数直接赋给字段。
继承
extends 继承父类,@override 重写方法,super 调用父类构造器与方法。Dart 单继承。
mixin
mixin 是可复用的行为片段,用 with 混入。比继承更灵活,避免单一继承限制。
抽象类
abstract class 不能被实例化,只定义契约。子类必须实现抽象方法。
接口
每个类都隐式是一个接口,用 implements 实现。implements 要求重写所有成员。
访问器
get 定义只读属性访问,set 定义可写属性。访问器调用时无需括号,隐藏内部存储。
静态成员
static 成员属于类本身而非实例。static 方法不能访问实例成员。
sealed 类
sealed 类限定子类必须在同一库内,switch 可穷尽匹配而无需 default。Dart 3 特性。
11.错误处理
try/catch、自定义异常与异步错误。
try / catch
try 包裹可能抛异常的代码,catch 捕获异常。catch (e) 取异常对象。
on 子句
on 指定只捕获特定类型的异常,与 catch 组合使用。按异常类型分流处理。
finally 与 rethrow
finally 无论是否异常都会执行,适合清理资源。rethrow 重新抛出保留原堆栈。
抛出异常
throw 关键字抛出异常对象。可抛任意对象,但惯例是抛 Exception 或 Error 子类。
自定义异常
implements Exception 定义业务异常。重写 toString 提供友好信息,可携带字段。
异步错误
async 函数中 await 抛出的异常可被 try/catch 捕获。未处理的 Future 错误会静默丢失。
流错误
Stream 监听可传 onError 回调处理错误。StreamController.addError 向流注入错误。
断言
assert 在开发模式检查条件,失败抛 AssertionError。发布模式断言被移除。
12.文件与 I/O
文件读写、JSON 与标准输入输出。
读取文件
dart:io 的 File 类读写文件。readAsString 读整个文本文件,需 import 'dart:io'。
写入文件
writeAsString 写入文本,writeAsBytes 写入二进制。追加模式用 mode 参数。
逐行读取
readAsLines 把文件按行拆成列表。大文件用 openRead 流式逐行处理,避免整文件载入。
JSON 处理
dart:convert 的 jsonEncode/jsonDecode 序列化与反序列化。JSON 数字解析为 int 或 double。
标准输入输出
stdin.readLineSync 同步读一行输入,stdout.writeln 输出。适合命令行交互程序。
目录操作
Directory.list 遍历目录内容,create 建目录,delete 删除。返回 FileSystemEntity。
二进制字节
readAsBytes 读二进制,Uint8List 表示字节。writeAsBytes 写入。适合图片、音频等。
路径操作
File/Directory 的 path 属性给完整路径。absolute 解析绝对路径,uri 转 file:// 形式。
13.常见坑
Dart 日常开发最容易踩的坑与正确写法。
滥用非空断言
用 ! 绕过空检查容易运行时崩溃。判空、?? 与类型提升更安全。
集合 == 比较
List/Map 的 == 比较引用而非内容。相同元素的列表不相等。需要结构比较用工具函数。
const 与 final
const 必须是编译期常量,final 运行时确定。把运行时值当 const 写会编译失败。
惰性 Iterable
map/where 返回惰性 Iterable,遍历时重新计算,底层变化会反映到结果。需要快照用 toList。
忘写 await
调用 async 函数不 await 会拿到 Future 而不是结果。并发任务用 Future.wait。
级联返回原对象
.. 级联对同一对象连续调用并返回该对象,不是最后表达式的结果。需要返回值时别用级联。
遍历时修改
遍历集合时增删元素会抛 ConcurrentModificationError。用 removeWhere 或收集后处理。
字符串按编码单元
length 返回 UTF-16 单元数,中文与 emoji 会多于字符数。按字符处理要遍历 runes。
14.并发与异步
isolate、Future、Stream 与事件循环。
isolate 并发
isolate 是 Dart 并发单元,各自有独立内存与事件循环。Isolate.run 或 Isolate.spawn 启动。
spawn 与端口
Isolate.spawn 以入口函数启动新 isolate,SendPort 发送消息,ReceivePort 接收消息。
Future 基础
Future 表示将来完成的结果。Future.value 直接成功,await 等待完成。
async / await
async 标记异步函数,await 等待异步操作。await 只能在 async 函数内使用。
流 Stream
Stream 是异步事件序列。listen 订阅事件,await for 逐个处理。与 Future 的单次不同。
StreamController
StreamController 手动控制流,add 发数据,addError 发错误,close 关闭。broadcast 支持多订阅。
等待多个 Future
Future.wait 并发等待全部完成,Future.any 等待最先完成的结果。
Completer
Completer 手动控制 Future 完成时机,适合把回调风格 API 转成 async/await 风格。
15.网络
HTTP 请求、WebSocket 与 TCP 套接字。
HTTP 客户端
dart:io 的 HttpClient 发起 HTTP 请求。getUrl 得到请求对象,关闭后读取响应体。
package:http
package:http 封装常用请求。http.get/post 返回 Response,body 直接是字符串。
URI 解析
Uri.parse 解析 URL,queryParameters 读取查询参数,Uri.http 构建请求地址。
JSON API
请求 JSON 接口并用 jsonDecode 解析响应体。结合 http 包与 Future 等待数据。
WebSocket
WebSocket 全双工通信。WebSocket.connect 连接,add 发送,流式接收消息。
TCP 套接字
Socket.connect 建立 TCP 连接,写入请求,读取响应。适合底层协议与自定义服务。
HTTP 服务端
HttpServer.bind 启动本地服务,监听请求并返回响应。适合开发调试与工具。
超时与错误
网络请求可能超时或失败。timeout 设置超时,异常用 try/catch 捕获并处理。
16.时间与日期
DateTime、Duration、格式化与时间戳。
当前时间
DateTime.now() 获取当前本地时间。各字段可直接访问,毫秒部分也可取。
构造时间
DateTime(年, 月, 日, ...) 构造指定时间。DateTime.utc 构造 UTC 时间。
时长
Duration 表示一段时间,支持时、分、秒与微秒。可加减、比较、转各时间单位。
格式化输出
Dart 没有内置 strftime,用 padLeft 补零拼格式,或用 intl 包的 DateFormat。
解析时间
DateTime.parse 解析 ISO 格式字符串。toIso8601String 生成标准格式便于解析与传输。
时间运算
add/subtract 加减时长,difference 计算两时间差,返回 Duration。
时间戳
毫秒/微秒时间戳便于存储与排序。fromMillisecondsSinceEpoch 从时间戳还原。
时区
DateTime 默认本地时区。isUtc 判断,toUtc/toLocal 转换。存储建议用 UTC。
计时器
Stopwatch 测量代码执行耗时。start/stop/reset 控制,elapsed 给出耗时。
17.进程与环境
子进程、环境变量、标准流与信号。
运行子进程
Process.run 运行外部命令并等待结果。result.stdout 与 stderr 捕获输出。
流式进程
Process.start 启动进程立即返回,可实时读 stdout 与写入 stdin。适合长时运行任务。
环境变量
Platform.environment 读取环境变量,返回只读 Map。不存在返回 null。
退出码
exitCode 设置进程退出码。0 成功,非 0 失败。命令行程序据此判断结果。
参数与脚本
args 是命令行参数,Platform.script 给出脚本路径。Directory.current 给当前目录。
标准流
stdout/stderr 输出,stdin 输入。flush 刷新缓冲,stderr 不参与管道正常输出。
文件系统
File/Directory 处理文件系统。create 建目录,delete 删,rename 移动,exists 判断存在。
信号处理
ProcessSignal 响应系统信号(SIGINT/SIGTERM)。用于优雅关闭服务或清理资源。
18.正则表达式
RegExp 的匹配、替换、分割与分组。
创建与判断
RegExp 表示正则表达式。hasMatch 判断是否匹配。r 前缀避免转义。
首个匹配
firstMatch 返回第一个匹配对象。group 取分组,start/end 给位置,无匹配返回 null。
全部匹配
allMatches 返回所有匹配的迭代器。配合模式可提取所有符合条件的内容。
替换
replaceAll 替换所有匹配,replaceFirst 只换第一个。回调形式按匹配内容动态生成替换。
分割
String.split 可接受 RegExp 按模式分割。分隔符不会进入结果列表。
分组捕获
圆括号定义捕获组。group(n) 取分组,命名组用 (?<name>...) 且按名访问。
标志参数
RegExp 构造器第二个参数设标志:caseSensitive 忽略大小写,multiLine 多行匹配。
常用模式
常见验证模式:邮箱、手机号、URL、IP。写成可复用常量便于维护。
19.构建与调试
pub、静态检查、格式化与测试。
pubspec 配置
pubspec.yaml 是包配置文件,声明名称、版本、SDK 与依赖。dart pub get 解析依赖。
pub 命令
dart pub get 安装、upgrade 升级、outdated 查看过期、add/remove 管理依赖。
静态检查
dart analyze 静态分析代码,报告错误与警告。运行在 CI 中保证代码质量。
格式化
dart format 统一代码风格。自动整理缩进、引号与换行,团队协作必备。
单元测试
package:test 提供 test() 与 expect 编写单元测试。dart test 运行。测试放 test/ 目录。
编译部署
dart compile 生成可执行文件。exe 原生可执行,js 编译到 JS,aot-snapshot 快照。
lint 规则
analysis_options.yaml 配置 lint 规则。lints 包提供推荐规则集,约束代码风格。
调试
print 打点调试最常用。assert 检查不变量,IDE 断点支持逐步执行。
关于本速查
本页是 Dart 3 的自包含速查手册,覆盖语言核心与最常用标准库在真实项目中约 80% 的常见用法。内容偏向现代惯用法:健全空安全、record 与 pattern、switch 表达式、sealed class、级联运算符,以及基于 isolate 的并发模型。Dart 由 Google 设计,是 Flutter 的底层语言,支持 JIT 快速开发与 AOT 高效发布两种执行方式。权威参考见官方 Dart 语言指南与 Effective Dart。 19 个章节各自聚焦一个主题——从第一个程序到 isolate、常见误区与构建测试。每节拆成 8 个带示例的小节(每个 5–15 行),共约 152 个主题。代码片段刻意短小、自解释,注释用中文便于对照学习。 所有处理都在浏览器中完成——无上传、无追踪。本页是 GuruToolkit 免费开发者工具集的一部分;代码片段可自由使用,无任何担保。
版本 2.1.0