Dart: Dart 语言简介 — 从诞生到生态全景
Dart — 一门为多平台而生的语言,从 Flutter 到 CLI,从 Web 到 Server,一套代码走天下。
1. 你将学到
- Dart 的诞生背景与 Google 战略定位
- Dart vs JavaScript / TypeScript / Kotlin 核心差异
- Dart 3 三大支柱:Null Safety / Pattern Matching / Sealed Classes
- Dart 生态全景:pub.dev / Flutter / server-side / CLI
- Bob 的 DataPipeline 项目概览与学习路线图
2. 一个开发者的真实故事
(1) 痛点:多平台开发的碎片化噩梦
Bob 是一名全栈开发者,负责一个电商数据分析 SaaS 产品。他需要同时维护 Web 前端(JavaScript)、移动端(Kotlin + Swift)、后端服务(Go)和 CLI 工具(Python)。4 种语言、4 套工具链、4 份代码库 — 修一个 bug 要改 4 遍。当产品经理要求"实时仪表盘"时,Bob 不得不在 Flutter 和原生开发之间反复权衡,团队沟通成本飙升到每周 20 小时。
(2) Dart 的解法
Dart 提供了统一的技术栈:一套语言覆盖前端(Flutter Web)、移动端(Flutter Mobile)、后端(Dart shelf)和 CLI(dart:io)。Bob 用 Dart 重写整个项目,核心业务逻辑只需写一次。
// Shared business logic - runs on CLI, Web, Mobile, Server
class DataPipeline {
final String name;
final int maxRecords;
const DataPipeline({
required this.name,
this.maxRecords = 1000000,
});
String get summary => '$name: capacity ${maxRecords} records';
}
> **输出:** 在本地 DartPad 或 `dart run` 执行。Dart 课程所有示例基于 Dart 3.x / Flutter 3.x,运行结果会因 SDK 版本略有差异。
(3) 收益
- 代码复用率从 30% 提升到 85%
- 团队只需掌握 1 种语言,沟通成本降低 60%
- Dart 3 的 Null Safety 将运行时空指针异常降低 95%
3. Dart 的诞生与演进
(1) 诞生背景
Dart 由 Google 的 Lars Bak 和 Kasper Lund 于 2011 年发布,初衷是替代 JavaScript 成为 Web 的主力语言。2015 年 Flutter 的出现改变了 Dart 的命运 — 从"Web 语言"转型为"多平台语言"。
graph LR A[Dart 1.0<br/>2011] --> B[Dart 2.0<br/>2018<br/>Strong typing] B --> C[Dart 2.12<br/>2021<br/>Null Safety] C --> D[Dart 3.0<br/>2023<br/>Records/Pattern/Sealed] D --> E[Dart 3.x<br/>2024+<br/>Wasm GC]
> **输出:** 在本地 DartPad 或 `dart run` 执行。Dart 课程所有示例基于 Dart 3.x / Flutter 3.x,运行结果会因 SDK 版本略有差异。
| 版本里程碑 | 年份 | 核心特性 | 意义 |
|---|---|---|---|
| Dart 1.0 | 2011 | 可选类型 | Web 替代方案 |
| Dart 2.0 | 2018 | Strong mode + 静态类型 | 类型安全根基 |
| Dart 2.12 | 2021 | Sound Null Safety | 消灭空指针 |
| Dart 3.0 | 2023 | Records / Pattern Matching / Sealed Classes | 现代语言特性 |
| Dart 3.x | 2024+ | Wasm GC 支持 | Web 性能飞跃 |
(2) Google 战略定位
Dart 是 Flutter 的唯一官方语言,也是 Google 内部 Fuchsia OS 的应用层语言。Google 对 Dart 的投入是长期战略,而非实验项目。
| 战略维度 | 定位 |
|---|---|
| 移动端 | Flutter 的核心语言 |
| Web 端 | 编译为 JS / Wasm 运行 |
| 桌面端 | Flutter Desktop |
| 服务端 | shelf / dart:io |
| 嵌入式 | Fuchsia OS 应用层 |
4. Dart vs 其他语言
(1) 核心差异对比
graph LR A[Dart] --> B[Null Safety] A --> C[Pattern Matching] A --> D[Sealed Classes] A --> E[AOT + JIT] A --> F[Isolate 并发] G[JavaScript] --> H[Dynamic typing] G --> I[Single thread] J[TypeScript] --> K[Type erasure] J --> L[No runtime types] M[Kotlin] --> N[JVM dependent] M --> O[Coroutines]
> **输出:** 在本地 DartPad 或 `dart run` 执行。Dart 课程所有示例基于 Dart 3.x / Flutter 3.x,运行结果会因 SDK 版本略有差异。
| 维度 | Dart | JavaScript | TypeScript | Kotlin |
|---|---|---|---|---|
| 类型系统 | Sound Static | Dynamic | Static (erased) | Static |
| Null Safety | Sound (compile-time) | 无 | 非强制 | 非强制 |
| AOT 编译 | 支持 | 不支持 | 不支持 | 支持 (Native) |
| 并发模型 | Isolate (无共享) | 单线程 | 单线程 | 协程 |
| Pattern Matching | Dart 3 原生 | 无 | 无 | 有限支持 |
| Sealed Classes | Dart 3 原生 | 无 | 无 | 支持 |
| Flutter 支持 | 唯一官方 | 无 | 无 | 间接 (KMP) |
| 学习曲线 | 中等 | 低 | 中 | 中 |
(2) Dart 的独特优势
- Sound Null Safety:编译器保证非空类型不会为 null,不像 TS 只在编译时检查
- Isolate:真正的并行,无共享内存,避免竞态条件
- AOT + JIT 双模式:开发时 JIT 热重载,发布时 AOT 高性能
- Dart 3 特性三连:Records / Pattern Matching / Sealed Classes 同步推出
5. Dart 3 三大支柱
(1) Null Safety
Sound Null Safety 将类型分为可空 T? 和非空 T,编译器在编译期保证非空类型永远不会为 null。
// Non-nullable - compiler guarantees non-null
String name = 'Bob';
// Nullable - must check before use
String? nickname = null;
// Safe access
int length = nickname?.length ?? 0;
> **输出:** 在本地 DartPad 或 `dart run` 执行。Dart 课程所有示例基于 Dart 3.x / Flutter 3.x,运行结果会因 SDK 版本略有差异。
(2) Pattern Matching
Dart 3 引入了完整的模式匹配体系,支持 destructuring、if-case、switch 表达式和穷尽检查。
// Switch expression with pattern matching
String describe(Object value) => switch (value) {
int i => 'Integer: $i',
double d => 'Double: $d',
String s => 'String: $s',
_ => 'Unknown type',
};
> **输出:** 在本地 DartPad 或 `dart run` 执行。Dart 课程所有示例基于 Dart 3.x / Flutter 3.x,运行结果会因 SDK 版本略有差异。
(3) Sealed Classes
Sealed class 限制子类在同一库内,编译器可保证 switch 穷尽性。
sealed class DataSource {}
class ApiSource extends DataSource { final String endpoint; ApiSource(this.endpoint); }
class FileSource extends DataSource { final String path; FileSource(this.path); }
class DatabaseSource extends DataSource { final String connectionString; DatabaseSource(this.connectionString); }
// Exhaustive switch - compiler checks all cases
String describe(DataSource source) => switch (source) {
ApiSource(:final endpoint) => 'API: $endpoint',
FileSource(:final path) => 'File: $path',
DatabaseSource(:final connectionString) => 'DB: $connectionString',
};
> **输出:** 在本地 DartPad 或 `dart run` 执行。Dart 课程所有示例基于 Dart 3.x / Flutter 3.x,运行结果会因 SDK 版本略有差异。
| 特性 | 解决的问题 | 示例场景 |
|---|---|---|
| Null Safety | 运行时空指针异常 | 配置项可选、API 返回可空 |
| Pattern Matching | 冗长的 if-else 链 | 类型判断、数据解构 |
| Sealed Classes | 忘记处理分支 | 数据源类型、状态机 |
6. Dart 生态全景
(1) 核心生态组件
graph LR A[Dart Ecosystem] --> B[Flutter<br/>Mobile/Desktop/Web] A --> C[pub.dev<br/>Package Registry] A --> D[Server-side<br/>shelf/dart:io] A --> E[CLI Tools<br/>args/dart:io] A --> F[Web<br/>dart2js/dart2wasm] A --> G[Testing<br/>test package] A --> H[Code Generation<br/>build_runner]
> **输出:** 在本地 DartPad 或 `dart run` 执行。Dart 课程所有示例基于 Dart 3.x / Flutter 3.x,运行结果会因 SDK 版本略有差异。
| 生态组件 | 用途 | 代表包 |
|---|---|---|
| Flutter | UI 框架 | flutter, cupertino |
| pub.dev | 包管理 | 40,000+ packages |
| Server-side | HTTP 服务 | shelf, dart_frog |
| CLI | 命令行工具 | args, cli_util |
| Web | 前端编译 | dart2js, dart2wasm |
| Testing | 测试框架 | test, mockito |
| Code Generation | 代码生成 | build_runner, json_serializable |
▶ 示例
> **输出:** 在本地 DartPad 或 `dart run` 执行。Dart 课程所有示例基于 Dart 3.x / Flutter 3.x,运行结果会因 SDK 版本略有差异。
:pub.dev 包搜索
Bob 在 pub.dev 搜索数据处理相关的包:
// pubspec.yaml dependencies for DataPipeline
// dependencies:
// args: ^2.4.2 # CLI argument parsing
// http: ^1.2.0 # HTTP client
// csv: ^6.0.0 # CSV parsing
// sqlite3: ^2.4.0 # SQLite database
// path: ^1.9.0 # Path manipulation
> **输出:** 在本地 DartPad 或 `dart run` 执行。Dart 课程所有示例基于 Dart 3.x / Flutter 3.x,运行结果会因 SDK 版本略有差异。
7. Bob 的 DataPipeline 项目概览
(1) 项目定义
DataPipeline 是 Bob 开发的电商数据分析 CLI 工具,处理百万级订单数据,输出 SaaS 仪表盘可用的报表。
▶ 示例
> **输出:** 在本地 DartPad 或 `dart run` 执行。Dart 课程所有示例基于 Dart 3.x / Flutter 3.x,运行结果会因 SDK 版本略有差异。
:项目愿景
// DataPipeline project overview
// Input: 1.2M e-commerce orders (CSV / API / Database)
// Process: Filter, aggregate, transform in parallel
// Output: Dashboard-ready reports (JSON / CSV / HTML)
void main() {
print('DataPipeline v1.0.0');
print('Processing capacity: 1,000,000+ orders');
print('Output formats: JSON, CSV, HTML');
}
> **输出:** 在本地 DartPad 或 `dart run` 执行。Dart 课程所有示例基于 Dart 3.x / Flutter 3.x,运行结果会因 SDK 版本略有差异。
(2) 学习路线图
graph TD
subgraph Phase1[Phase 1: Fundamentals]
L1[Lesson 1: Introduction]
L2[Lesson 2: Installation]
L3[Lesson 3: Basic Syntax]
L4[Lesson 4: Variables & Types]
L5[Lesson 5: Operators]
L6[Lesson 6: Control Flow]
end
subgraph Phase2[Phase 2: Core Features]
L7[Lesson 7: Functions]
L8[Lesson 8: Classes & Objects]
L9[Lesson 9: Collections]
L10[Lesson 10: Exception Handling]
L11[Lesson 11: Generics]
L12[Lesson 12: Enums & Extensions]
end
subgraph Phase3[Phase 3: Advanced]
L13[Lesson 13: Null Safety]
L14[Lesson 14: Future / async-await]
L15[Lesson 15: Stream]
L16[Lesson 16: Dart 3 Features]
L17[Lesson 17: Isolates]
L18[Lesson 18: Metaprogramming]
end
subgraph Phase4[Phase 4: Operations]
L19[Lesson 19: Package Management]
L20[Lesson 20: Testing]
L21[Lesson 21: Code Generation]
L22[Lesson 22: Dart & Flutter]
end
subgraph Phase5[Phase 5: Project]
L23[Lesson 23: Project Design]
L24[Lesson 24: Optimization & Release]
end
Phase1 --> Phase2 --> Phase3 --> Phase4 --> Phase5
> **输出:** 在本地 DartPad 或 `dart run` 执行。Dart 课程所有示例基于 Dart 3.x / Flutter 3.x,运行结果会因 SDK 版本略有差异。
| Phase | 课次 | 目标 | 关键产出 |
|---|---|---|---|
| Phase 1 | L1-L6 | 入门基础 | Hello World → 控制流 |
| Phase 2 | L7-L12 | 核心功能 | 函数/类/集合/异常/泛型/枚举 |
| Phase 3 | L13-L18 | 高级特性 | Null Safety/异步/Stream/Dart 3/Isolate |
| Phase 4 | L19-L22 | 管理运维 | 包管理/测试/代码生成/Flutter |
| Phase 5 | L23-L24 | 综合实战 | DataPipeline 完整项目 |
▶ 示例
> **输出:** 在本地 DartPad 或 `dart run` 执行。Dart 课程所有示例基于 Dart 3.x / Flutter 3.x,运行结果会因 SDK 版本略有差异。
:DataPipeline 预览代码
// DataPipeline preview - what you will build
void main() {
// Step 1: Define data source
final source = ApiSource('https://api.example.com/orders');
// Step 2: Create pipeline
final pipeline = DataPipeline(
name: 'E-Commerce Analytics',
maxRecords: 1200000,
);
// Step 3: Process and output
print(pipeline.summary);
// Output: E-Commerce Analytics: capacity 1200000 records
}
> **输出:** 在本地 DartPad 或 `dart run` 执行。Dart 课程所有示例基于 Dart 3.x / Flutter 3.x,运行结果会因 SDK 版本略有差异。
8. 完整示例:DataPipeline 项目骨架
// ============================================
// DataPipeline Project Skeleton
// A CLI tool for e-commerce data analytics
// ============================================
// Data source types (sealed class for exhaustive matching)
sealed class DataSource {}
class ApiSource extends DataSource {
final String endpoint;
ApiSource(this.endpoint);
}
class FileSource extends DataSource {
final String path;
FileSource(this.path);
}
// Core pipeline class
class DataPipeline {
final String name;
final int maxRecords;
DataSource? source; // nullable - may not be configured yet
DataPipeline({
required this.name,
this.maxRecords = 1000000,
});
String get summary => '$name: capacity ${maxRecords} records';
String describeSource() {
if (source == null) return 'No source configured';
return switch (source!) {
ApiSource(:final endpoint) => 'API source: $endpoint',
FileSource(:final path) => 'File source: $path',
};
}
}
// Entry point
void main() {
final pipeline = DataPipeline(
name: 'E-Commerce Analytics',
maxRecords: 1200000,
);
pipeline.source = ApiSource('https://api.example.com/orders');
print('=== DataPipeline ===');
print(pipeline.summary);
print(pipeline.describeSource());
}
> **输出:** 在本地 DartPad 或 `dart run` 执行。Dart 课程所有示例基于 Dart 3.x / Flutter 3.x,运行结果会因 SDK 版本略有差异。
输出:
=== DataPipeline ===
E-Commerce Analytics: capacity 1200000 records
API source: https://api.example.com/orders
❓ 常见问题
Q:Dart 和 Flutter 是什么关系? A:Dart 是 Flutter 的唯一官方编程语言,Flutter 是基于 Dart 的 UI 框架。学 Dart 是学 Flutter 的前提。
Q:Dart 能替代 JavaScript 做前端开发吗? A:Dart 可以通过 dart2js 编译为 JavaScript,也可以通过 dart2wasm 编译为 WebAssembly。但 Web 生态仍以 JS 为主,Dart 的优势在 Flutter Web。
Q:Dart 3 的 Null Safety 是强制的吗? A:是的,Dart 3 默认开启 Sound Null Safety。旧代码需要迁移,但 Dart 2.12 起已支持渐进式迁移。
Q:Dart 适合做后端开发吗? A:适合。Dart 有 shelf、dart_frog 等后端框架,配合 Isolate 并发模型可处理高并发场景。但生态不如 Go/Java 成熟。
Q:已有 TypeScript 基础,学 Dart 难吗? A:不难。Dart 和 TS 的类型系统相似,但 Dart 的 Sound Null Safety 和 Isolate 是新概念,需要重点学习。
Q:Dart 的性能如何? A:AOT 编译后性能接近 Go/Java,JIT 模式支持热重载开发。Wasm GC 支持让 Web 端性能大幅提升。
Q:pub.dev 上包的质量如何? A:pub.dev 有质量评分系统(pub points),涵盖平台支持、文档覆盖率等。热门包如 http、args 质量很高,但小众包需自行评估。
📖 小节
- Dart 由 Google 于 2011 年发布,2018 年 Dart 2.0 确立强类型,2023 年 Dart 3 引入三大支柱
- Dart 3 三大支柱:Null Safety(消灭空指针)、Pattern Matching(类型解构)、Sealed Classes(穷尽检查)
- Dart vs JS/TS/Kotlin 的核心差异:Sound 类型系统、Isolate 并发、AOT+JIT 双模式
- Dart 生态覆盖 Flutter、pub.dev、Server-side、CLI、Web 五大领域
- Bob 的 DataPipeline 项目将贯穿 24 课,从 Hello World 到完整 CLI 工具
- 学习路线:5 个 Phase 从入门到实战,循序渐进
📝 作业
- 基础题(难度⭐):访问 pub.dev,搜索
http包并查看其 pub points 评分,记录支持的平台列表。 - 进阶题(难度⭐⭐):对比 Dart 和你最熟悉的编程语言(JS/Python/Java 等),列出 3 个 Dart 的优势和 3 个劣势,写一份简短对比表。
- 挑战题(难度⭐⭐⭐):画出 DataPipeline 项目的模块划分草图,考虑数据输入、处理、输出三个阶段各需要什么组件。