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 正是为此而生。

相关推荐
maaath16 小时前
【maaath】 Flutter for OpenHarmony 实战:电池优化应用开发指南
flutter·华为·harmonyos
勤劳打代码17 小时前
Flutter 架构日记 —— 可演进的 Flutter Dialog 组件
flutter·架构
Eric_HYD20 小时前
Flutter 字体字生效原理解析
flutter
maaath21 小时前
【无标题】Flutter for OpenHarmony 的文具手账应用开发实践
flutter·华为·harmonyos
里欧跑得慢21 小时前
Flutter 主题管理:构建一致的用户界面
前端·css·flutter·web
liulian09161 天前
Flutter for OpenHarmony 跨平台开发:单位转换功能实战指南
flutter
千码君20162 天前
Trae:一些关于flutter和 go前后端开发构建的分享
android·flutter·gradle·android-studio·trae·vibe code
maaath2 天前
【maaath】Flutter for OpenHarmony 手表配饰应用实战开发
flutter·华为·harmonyos
maaath2 天前
【maaath】Flutter for OpenHarmony 跨平台计算器应用开发实践
flutter·华为·harmonyos
maaath2 天前
【maaath】Flutter for OpenHarmony 闹钟时钟应用开发实战
flutter·华为·harmonyos