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

相关推荐
见山是山-见水是水3 小时前
鸿蒙flutter第三方库适配 - 读书笔记
flutter·华为·harmonyos
Utopia^4 小时前
鸿蒙flutter第三方库适配 - 图片压缩工具
flutter·华为·harmonyos
见山是山-见水是水7 小时前
鸿蒙flutter第三方库适配 - 车辆管理
flutter·华为·harmonyos
Utopia^9 小时前
鸿蒙flutter第三方库适配 - 番茄钟专注
flutter·华为·harmonyos
程序员老刘12 小时前
放弃折腾后端服务器后,这才是独立开发MVP的最优解
flutter·客户端·firebase
独特的螺狮粉12 小时前
云隙一言:鸿蒙Flutter框架 实现的随机名言应用
开发语言·flutter·华为·架构·开源·harmonyos
Utopia^14 小时前
鸿蒙flutter第三方库适配 - 图片拼图工具
flutter·华为·harmonyos
星释14 小时前
鸿蒙Flutter实战:29.优先使用联合插件开发鸿蒙化插件
flutter·华为·harmonyos·鸿蒙
见山是山-见水是水16 小时前
鸿蒙flutter第三方库适配 - 文件加密工具
flutter·华为·harmonyos
麒麟ZHAO16 小时前
鸿蒙flutter第三方库适配 - 文件对比工具
数据库·redis·flutter·华为·harmonyos