Flutter 网络层设计最佳实践(sealed + Result + Future)

一、为什么 Flutter 网络层"容易写烂"?

大多数 Flutter 项目的网络层长这样:

Dart 复制代码
final res = await api.getUser();

if (res.code == 0) {
  use(res.data);
} else {
  showToast(res.msg);
}

问题是:

  1. ❌ 成功 / 失败 / 异常 混在一起
  2. ❌ data / msg 到处判空
  3. ❌ UI 层逻辑膨胀
  4. ❌ 无法强制处理异常

本质问题是:

返回值没有被建模,只是一个"松散结构"

二、正确的思路:用 sealed 建模"结果"

Kotlin 世界早就这么干了

Kotlin 复制代码
sealed class Result<out T> {
    data class Success<T>(val data: T): Result<T>()
    data class Error(val msg: String): Result<Nothing>()
}

Dart 中的等价写法(推荐)

Dart 复制代码
sealed class ApiResult<T> {}

class Success<T> extends ApiResult<T> {
  final T data;
  Success(this.data);
}

class Failure<T> extends ApiResult<T> {
  final String message;
  Failure(this.message);
}

class ExceptionResult<T> extends ApiResult<T> {
  final Object error;
  ExceptionResult(this.error);
}

三、网络层的正确打开方式

1️⃣ 网络请求统一返回 ApiResult<T>

Dart 复制代码
Future<ApiResult<User>> getUser() async {
  try {
    final res = await dio.get('/user');

    if (res.data['code'] == 0) {
      return Success(User.fromJson(res.data['data']));
    } else {
      return Failure(res.data['msg']);
    }
  } catch (e) {
    return ExceptionResult(e);
  }
}

2️⃣ UI 层用 switch(极其清晰)

Dart 复制代码
final result = await getUser();

switch (result) {
  case Success(:final data):
    showUser(data);
  case Failure(:final message):
    showToast(message);
  case ExceptionResult(:final error):
    showError(error);
}

✅ 无 null

✅ 无 magic number

✅ 没有 if-else 地狱

✅ 编译期安全

四、这种设计的核心优势

优点 说明
类型安全 不可能误用 data
结构清晰 状态即结构
易维护 新增状态不影响旧代码
强约束 UI 必须处理所有情况

五、总结一句话

网络层的本质不是"请求数据",而是"描述结果状态"。

sealed 正是为此而生。

相关推荐
好的佩奇13 小时前
Dart 之类型系统
flutter·dart
恋猫de小郭20 小时前
Dart 3.15 新特性:this 终于支持类型提升了
android·前端·flutter
FungLeo2 天前
成为全栈·Flutter App 篇·主题与可访问性:深浅色、大字号和触控体验
flutter·移动开发·深色模式·可访问性·成为全栈·大字号适配
用户95421573334853 天前
只是选个照片,怎么留下了这么多访问记录?Flutter 图片选择器排查与优化实录
flutter
FungLeo3 天前
成为全栈·Flutter App 篇·第四批复盘:复用了什么,移动端又新增了什么
flutter·移动开发·跨端开发·成为全栈·api契约·全栈复盘
jason.zeng@15022073 天前
使用vscode+flutter开发android程序(入门)
android·vscode·flutter
jason.zeng@15022073 天前
Flutter 项目标准分层目录(repository/dto/page,对齐后端思想)
flutter
程序员老刘4 天前
跨平台开发地图 | 2026年10月
flutter·ai编程·客户端
林瞅瞅5 天前
Flutter 开发环境从零搭建与调试记录
flutter
FungLeo5 天前
成为全栈·Flutter App 篇·Markdown 编辑器:编辑、预览与离开保护
flutter·移动开发·markdown编辑器·表单设计·成为全栈·草稿保存