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

相关推荐
王晓枫9 小时前
flutter接入三方库运行报错:Error running pod install
前端·flutter
shankss17 小时前
Flutter 下拉刷新库 pull_to_refresh_plus 设计与实现分析
flutter
忆江南1 天前
iOS 深度解析
flutter·ios
明君879971 天前
Flutter 实现 AI 聊天页面 —— 记一次 Markdown 数学公式显示的踩坑之旅
前端·flutter
恋猫de小郭1 天前
移动端开发稳了?AI 目前还无法取代客户端开发,小红书的论文告诉你数据
前端·flutter·ai编程
MakeZero2 天前
Flutter那些事-交互式组件
flutter
shankss2 天前
pull_to_refresh_simple
flutter
shankss2 天前
Flutter 下拉刷新库新特性:智能预加载 (enableSmartPreload) 详解
flutter
SoaringHeart3 天前
Flutter调试组件:打印任意组件尺寸位置信息 NRenderBox
前端·flutter
九狼3 天前
Flutter URL Scheme 跨平台跳转
人工智能·flutter·github