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

相关推荐
tbit19 小时前
Android Google Map PlatformView 图层异常排查与修复
flutter
哈__19 小时前
Flutter 3.44.9 + OpenHarmony7:home_widget 三方库桌面服务卡片(FormKit)的应用
flutter·华为·harmonyos
哈__21 小时前
Flutter 3.44.9 + OpenHarmony7:image_cropper三方库 图片裁剪的应用
flutter·openharmony
淡写成灰1 天前
「Flutter 文件保存太难了?」一个插件打通 7 大平台,我把方案开源了 🎉
flutter·harmonyos
坚果的博客2 天前
Flutter 三方库 phone_state 的 OpenHarmony 适配实战
flutter
ljt27249606612 天前
Flutter笔记--本地通知
笔记·flutter
lqj_本人2 天前
Flutter 三方库 Pedometer 的鸿蒙化适配指南
flutter·华为·harmonyos
Android-Flutter3 天前
flutter GetX 详解
android·flutter
坚果的博客3 天前
Flutter OHOS 环境搭建实战:oh-3.44.9-dev 从 0 到 1 完整记录
flutter·华为·harmonyos
Crazy_MT3 天前
Android Studio 运行 Flutter iOS 真机白屏,但 Xcode 和命令行正常的排查记录
flutter·android studio