Dart 3.x 完全指南:Records / Patterns / Class Modifiers(2026)
Dart 3.x(2023-2026 持续更新)带来了革命性的语言特性:Records、Patterns、Class Modifiers。本文全面解析这些新特性,附完整实战代码和迁移建议。
一、Dart 3.x 版本概览
markdown
Dart 3.0(2023.5) → Records + Patterns + Class modifiers
↓
Dart 3.1(2023.10) → 进一步性能优化
↓
Dart 3.2(2024.5) → 新 FFI 机制 + Native Assets
↓
Dart 3.3+(2025-2026)→ 持续优化,与 Flutter 3.x 同步
为什么需要学习 Dart 3.x?
| 理由 | 说明 |
|---|---|
| Flutter 3.16+ 默认要求 | 新版本 Flutter 基于 Dart 3.x |
| 代码更简洁 | Records + Patterns 减少大量模板代码 |
| 类型更安全 | Class Modifiers 让 API 设计更严谨 |
| 性能更好 | Dart 3.x 编译器优化更激进 |
二、Records(记录类型)
2.1 什么是 Records?
Records 让你可以返回多个值,无需定义新类:
dart
// ❌ 旧写法:需要定义类或使用 List/Map
class UserInfo {
final String name;
final int age;
final bool isVip;
UserInfo(this.name, this.age, this.isVip);
}
UserInfo getUserInfo() {
return UserInfo('Alice', 25, true);
}
// ✅ Dart 3.x:使用 Record
(String, int, bool) getUserInfo() {
return ('Alice', 25, true);
}
void main() {
final info = getUserInfo();
print('Name: ${info.$1}'); // Alice
print('Age: ${info.$2}'); // 25
print('VIP: ${info.$3}'); // true
}
2.2 命名 Records(更可读)
dart
// 使用命名字段
({String name, int age, bool isVip}) getUserInfo() {
return (name: 'Alice', age: 25, isVip: true);
}
void main() {
final info = getUserInfo();
print('Name: ${info.name}'); // Alice
print('Age: ${info.age}'); // 25
}
2.3 Record 作为函数参数**
dart
// Record 作为函数参数
void printUserInfo(({String name, int age}) user) {
print('${user.name} is ${user.age} years old');
}
void main() {
printUserInfo((name: 'Bob', age: 30));
}
2.4 Record 类型别名**
dart
// 定义 Record 类型别名
typedef UserInfo = ({String name, int age, bool isVip});
UserInfo getUserInfo() {
return (name: 'Alice', age: 25, isVip: true);
}
三、Patterns(模式匹配)
3.1 什么是 Patterns?
Patterns 让你可以解构对象 并匹配条件,大幅简化代码:
dart
// ❌ 旧写法:手动解析 Map
void handleResponse(Map<String, dynamic> json) {
final code = json['code'] as int;
final data = json['data'] as List;
if (code == 200) {
print('Data: $data');
}
}
// ✅ Dart 3.x:使用 Patterns
void handleResponse(Map<String, dynamic> json) {
if (json case {'code': 200, 'data': List data}) {
print('Data: $data');
}
}
3.2 Switch 表达式(使用 Patterns)**
dart
// ✅ Dart 3.x:Switch 表达式 + Patterns
String getDescription(({String name, int age}) user) => switch (user) {
(name: _, age: < 18) => '$name 是未成年人',
(name: _, age: >= 18, age: < 60) => '$name 是成年人',
(name: _, age: >= 60) => '$name 是老年人',
_ => '未知',
};
3.3 对象解构**
dart
class Point {
final double x, y;
const Point(this.x, this.y);
}
// ✅ Dart 3.x:对象解构 Pattern
void printPoint(Point p) {
final Point(:x, :y) = p;
print('x=$x, y=$y');
}
// 更简洁的写法
void printPoint2(Point(:x, :y)) {
print('x=$x, y=$y');
}
3.4 Null 检查 Pattern**
dart
// ✅ Dart 3.x:Null 检查 Pattern
void handleValue(String? value) => switch (value) {
null => print('Value is null'),
String s when s.isEmpty => print('Value is empty'),
String s => print('Value: $s'),
};
四、Class Modifiers(类修饰符)
4.1 什么是 Class Modifiers?
Class Modifiers 让你精确控制类如何被继承/实现,大幅提升 API 安全性:
kotlin
Dart 3.x 类修饰符矩阵:
是否可以继承 是否可以实现(interface)
base class ❌ 不可以 ✅ 可以
interface class ✅ 可以 ✅ 可以(默认)
final class ❌ 不可以 ❌ 不可以
sealed class ✅ 仅同库内 ✅ 仅同库内
abstract class(已有) ✅ 可以 ✅ 可以
mixin(已有) ❌ 不可以 ✅ 可以(with)
4.2 base class(禁止外部继承)**
dart
// 基类:禁止外部库继承
base class Animal {
void makeSound();
}
// ✅ 同库内可以继承
class Dog extends Animal {
@override
void makeSound() => print('Woof!');
}
// ❌ 其他库继承 → 编译错误!
// class Cat extends Animal {} // Error: Cannot extend base class
4.3 interface class(纯接口)**
dart
// 接口类:可以被 implements
interface class Repository {
Future<List<User>> getUsers();
}
// ✅ 任何类都可以实现
class UserRepository implements Repository {
@override
Future<List<User>> getUsers() => // ...
}
4.4 final class(完全封闭)**
dart
// 最终类:不能继承,也不能实现
final class StringUtils {
static String reverse(String s) => s.split('').reversed.join();
}
// ❌ 其他库不能继承
// class MyUtils extends StringUtils {} // Error!
4.5 sealed class(封闭层次结构)**
dart
// 密封类:子类必须在同库内定义(完美配合 Switch)
sealed class Result {
const Result();
}
class Success extends Result {
final data;
const Success(this.data);
}
class Error extends Result {
final String message;
const Error(this.message);
}
// ✅ Switch 必须覆盖所有子类(编译期保证!)
String handleResult(Result result) => switch (result) {
Success(data: final d) => 'Success: $d',
Error(message: final m) => 'Error: $m',
// 不需要 default,因为已覆盖所有情况
};
五、新语法糖汇总
5.1 隐式类型转换(if-case)**
dart
// ✅ Dart 3.x:if-case 模式
void handleResponse(Map<String, dynamic> json) {
if (json case {'code': 200, 'data': List data}) {
print('Got data: $data');
} else if (json case {'code': final code, 'message': final msg}) {
print('Error $code: $msg');
}
}
5.2 for-in 循环中的 Patterns**
dart
// ✅ Dart 3.x:for 循环中使用 Pattern
void printUsers(List<({String name, int age})> users) {
for (final (:name, :age) in users) {
print('$name: $age');
}
}
5.3 列表解构**
dart
// ✅ Dart 3.x:列表解构
void printFirstTwo(List<int> list) {
if (list case [int first, int second, ...]) {
print('First: $first, Second: $second');
}
}
六、迁移指南(从 Dart 2.x → 3.x)**
6.1 启用 Dart 3.x**
yaml
# pubspec.yaml
environment:
sdk: '>=3.0.0 <4.0.0' # ✅ 要求 Dart 3.0+
6.2 常见迁移问题**
| 问题 | 解决方案 |
|---|---|
with 关键字冲突(作为类名) |
重命名类,或使用 with as a name with quotes: with |
| 空安全更严格 | 使用 ! 或 ? 明确处理可空类型 |
enum 构造函数限制 |
移除 enum 中的非-const 构造函数 |
mixin 不能有构造函数 |
改为 abstract class |
6.3 迁移步骤**
lua
第 1 步:修改 pubspec.yaml → 设置 sdk: '>=3.0.0 <4.0.0'
↓
第 2 步:运行 dart pub get
↓
第 3 步:运行 dart fix --apply
↓
第 4 步:手动修复剩余编译错误
↓
第 5 步:使用 dart format 格式化代码
七、实战:用 Records + Patterns 重构代码**
7.1 重构前(Dart 2.x 风格)**
dart
// 旧代码:使用定义类
class ApiResult<T> {
final int code;
final String message;
final T? data;
ApiResult(this.code, this.message, this.data);
}
void handleResult(ApiResult<User> result) {
if (result.code == 200) {
print('User: ${result.data?.name}');
} else {
print('Error: ${result.message}');
}
}
7.2 重构后(Dart 3.x 风格)**
dart
// 新代码:使用 Record + Pattern
typedef ApiResult<T> = ({int code, String message, T? data});
void handleResult(ApiResult<User> result) => switch (result) {
(code: 200, data: final user?) => print('User: ${user.name}'),
(code: final code, message: final msg) => print('Error $code: $msg'),
};
八、性能影响**
| 特性 | 性能影响 |
|---|---|
| Records | ✅ 零额外开销(编译期优化) |
| Patterns | ✅ 编译期优化,无运行时开销 |
| Class Modifiers | ✅ 编译期检查,无运行时开销 |
| 总体 | ✅ 代码更简洁,编译后体积更小 |
九、学习资源**
| 资源 | 链接 |
|---|---|
| Dart 3.x 官方文档 | dart.dev/language-ev... |
| Records 详解 | dart.dev/language/re... |
| Patterns 详解 | dart.dev/language/pa... |
| Class Modifiers 详解 | dart.dev/language/cl... |
总结**
Dart 3.x 的核心价值是更简洁的代码 + 更安全的类型系统:
markdown
Records → 多返回值无需定义新类
↓
Patterns → 解构 + 匹配,减少模板代码
↓
Class Modifiers → API 设计更严谨
↓
代码更简洁 → 可维护性更好
立即行动:
- ✅ 升级 Flutter 到 3.16+(自带 Dart 3.x)
- ✅ 修改
pubspec.yaml中的 SDK 版本 - ✅ 运行
dart fix --apply自动迁移 - ✅ 开始使用 Records + Patterns 简化代码
如果本文对你有帮助,欢迎点赞 + 收藏。后续会更新 Dart 3.x 高级模式和性能优化技巧。