Dart Sealed Class 与模式匹配实战指南
· 阅读需 9 分钟
在 Flutter 应用开发中,我们经常需要处理多种状态和类型的数据。例如,一个网络请求可能处于加载中、成功、失败等不同状态。传统的做法可能使用枚举或继承体系来处理这些情况,但往往会面临类型安全和维护性的挑战。
Dart 3.0 引入的 sealed class 和增强的模式匹配特性,为这类问题提供了更优雅的解决方 案。其实我们已经在前面的文章《Flutter 优化 API 错误响应:Result 模式实践指南》 中提过 sealed class ,并给出了具体的实现方式,但是没有针对这个新语法做更多的深入探索。本文将延续这一话题,让我们通过实际案例来更加深入理解这些特性。
版本要求
- Dart SDK: 3.0 或更高版本
- Flutter: 3.10 或更高版本
Sealed Class 基础
sealed class 是一种特殊的抽象类,它限定了可能的子类集合。这种限制在编译时就能确保所有可能的类型都被正确处理。让我们看一个实际的例子:
sealed class ApiResponse {
const ApiResponse();
}
final class Loading extends ApiResponse {
final DateTime startTime;
const Loading({required this.startTime});
}
final class Success extends ApiResponse {
final dynamic data;
final DateTime timestamp;
const Success({required this.data, required this.timestamp});
}
final class Failure extends ApiResponse {
final String message;
final int statusCode;
final DateTime timestamp;
const Failure({
required this.message,
required this.statusCode,
required this.timestamp
});
}
这个设计有几个关键优点:
- 类型安全: 所有 ApiResponse 的可能类型都在编译时确定
- 穷尽性检查: 编译器确保处理所有可能的情况
- 封闭性: 防止在其他文件中创建新的子类
模式匹配详解
Dart 3.0 引入的模式匹配让我们能更优雅地处理 sealed class。以下展示两种主要的使用方式: