Dart 3 Record:解决 Future.wait 异构返回值的类型问题

在 Flutter 开发中,经常会遇到多个接口需要同时请求的场景。

例如进入图书详情页时,需要同时获取书籍信息和收藏状态:

ini 复制代码
final infoFuture = bookApi.getBookInfo(bookId);
final favoriteFuture = favoriteApi.isFavorite(bookId);

两个请求互不依赖,可以使用 Future.wait:

ini 复制代码
final responses = await Future.wait([
  infoFuture,
  favoriteFuture,
]);

这种写法可以并发等待多个 Future,但当这些 Future 的返回类型不同时,会出现一个问题:结果列表无法保留每个元素原本的具体类型。

Future.wait 的类型问题

假设两个请求的返回类型分别是:

ini 复制代码
Future<BookInfo> infoFuture;
Future<bool> favoriteFuture;

我们使用:

ini 复制代码
final responses = await Future.wait([
  infoFuture,
  favoriteFuture,
]);

两个 Future 返回的类型不同:

arduino 复制代码
BookInfo
bool

但 Future.wait 最终返回的是一个 List。

这时无法得到类似:

arduino 复制代码
List<BookInfo, bool>

这样的类型。

因此,实际使用时通常需要进行类型转换:

ini 复制代码
final bookInfo = responses[0] as BookInfo;
final isFavorite = responses[1] as bool;

完整代码:

ini 复制代码
final responses = await Future.wait([
  infoFuture,
  favoriteFuture,
]);

final bookInfo = responses[0] as BookInfo;
final isFavorite = responses[1] as bool;

代码能运行,但有两个问题。

第一,需要自己记住 responses[0] 和 responses[1] 分别是什么。

第二,需要手动使用 as 转换类型。

当 Future 增多后:

ini 复制代码
final results = await Future.wait([
  bookFuture,
  favoriteFuture,
  commentsFuture,
  authorFuture,
]);

后面就会出现:

ini 复制代码
final book = results[0] as Book;
final favorite = results[1] as bool;
final comments = results[2] as List<Comment>;
final author = results[3] as Author;

这不仅不直观,也失去了 Dart 静态类型系统带来的便利。

Dart 3 使用 Record 保留类型

如果项目使用 Dart 3,可以使用 Record。

把原来的:

ini 复制代码
final responses = await Future.wait([
  infoFuture,
  favoriteFuture,
]);

改成:

scss 复制代码
final (bookInfo, isFavorite) = await (
  infoFuture,
  favoriteFuture,
).wait;

这里的两个 Future 仍然会并发执行。

区别在于,Record 可以保留每个位置对应的具体类型。

也就是说:

scss 复制代码
final (bookInfo, isFavorite) = await (
  infoFuture,
  favoriteFuture,
).wait;

得到的变量类型分别是:

arduino 复制代码
bookInfo   → BookInfo
isFavorite → bool

不需要再写:

csharp 复制代码
as BookInfo
as bool

也不需要通过:

css 复制代码
results[0]
results[1]

访问结果。

相关推荐
鸿蒙开发1 小时前
共享 Schema 与 SchemaFactory
前端·后端·harmonyos
屏什么录1 小时前
录屏超过两小时就卡顿崩盘?从参数调优到代码实现,一文彻底搞定长时间录屏
前端·音视频开发
计算机魔术师1 小时前
950亿怎么拆:Meta给AI基建配的三档弹药
前端
碳基生物猛吃膳食纤维1 小时前
结合DEEPSEEK和CHATGPT弄了个小脚本,批量检查商品主图
前端
绝世唐门三哥1 小时前
CSS 换行三剑客:overflow-wrap、word-break 与 white-space 完全指南
前端·css
kyriewen1 小时前
别再用防抖做懒加载了:120 张图只加载出 4 张
前端·javascript·程序员
计算机魔术师1 小时前
Hugging Face CEO 转评前 DOGE 研究人员用 AI 智能体渗透 Anthropic 系统事件
前端
IT_陈寒2 小时前
刚解决一个 Java 并发问题,这坑踩得我怀疑人生
前端·人工智能·后端
前端一课2 小时前
一个晚上,四个“小问题”:我重写了 12 章 ArkUI 笔记
前端
小码哥_常2 小时前
前端图片压缩实战——我把网站图片体积砍了 70%
前端