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