Dart中Future与Stream的区别及使用场景
时间:2026-08-21 | 作者:怪兽小助手 | 阅读:0Dart Future 和 Stream 的区别
- Dart 中使用 Future 和 Stream 编写异步任务
Future 单次异步结果
- 用于表示一个尚未完成的异步操作的结果,承诺最终会返回一个值(或错误),适用于如网络请求、数据库查询、文件读取和延迟任务等
- Future 无需手动关闭
- Future 的所有 API 的返回值仍然是一个 Future 对象,所以可以很方便的进行链式调用
Future 适合处理单次异步结果。
例如网络请求、数据库查询、文件读取和延迟任务,都可以使用 Future。
使用 async 创建 Future
Future<String> fetchData() async {
var response = await http.get(Uri.parse('https://api.example.com/data'));
print(response.body);
return "Data fetched successfully!";
}
通过 then 来使用 Future
fetchData()
.then((value) => print("Result: $value")) //成功回调
.catchError((error) => print("Error: $error")); //失败错误处理
.whenComplete(() => print("Task done")); //完成回调,不管成功或失败都会执行
借助 async 和 await 来运用 Future
void gainData() async {
try {
String data = await fetchData();
print(data);
} catch (e) {
print("Error: $e");
}
}
Stream 连续异步事件流
- 用于表示一系列异步事件的序列(数据流),可以持续发送多个数据(或错误),适用于如传感器数据、实时推送、键盘输入、轮询请求和定时器等
- Stream 需要手动关闭
Stream 适合处理连续异步事件。
如果数据会持续到来,或者需要多次推送结果,通常使用 Stream。
借助 StreamController 来生成 Stream
//StreamController 用于管理流的创建、发送数据和关闭
StreamController<String> streamController = StreamController<String>();
Stream<String> dataStream = streamController.stream;
//
streamController.sink.add("Data 1");
streamController.sink.add("Data 2");
使用 async* 创建 Stream
Stream<String> fetchDataStream() async* {
for (int i = 0; i < 3; i++) {
await Future.delayed(const Duration(seconds: 1)); //模拟异步耗时
yield "Data $i"; //生成发送数据
}
}
通过 listen 监听 Stream 的事件
streamController.stream.listen(
(data) => print("Received: $data"), //数据回调
onError: (error) => print("Error: $error"), //错误回调(可选)
onDone: () => print("Stream completed"), //完成回调(可选)
);
//不再需要发送数据后要手动关闭
streamController.close();
Future 转换为 Stream
Future 可以转换为 Stream。
如果需要把单次异步结果接入流式处理,可以使用转换方式。
//使用 Stream.fromFuture 将单个 Future 转为流(发送一次数据后完成)
Future<String> futureData = fetchData();
Stream<String> streamData = Stream.fromFuture(futureData);
//转换多个 Future
Stream<String> streamData2 = Stream.fromFutures([futureData,futureData2]);
Stream<String> streamFromFutures(IterableString>> futures) async* {
for (final future in futures) {
var result = await future;
yield result; //发送 Future 结果
}
}
//
Stream<String> streamFromFuture(Future<String> future) async* {
final result = await future;
yield result; //发送 Future 结果
yield "Additional data"; //可追加其他数据
}
总结
- Future 用于表示一个尚未完成的异步操作的结果,承诺最终会返回一个值,Stream 用于表示一系列异步事件的序列(数据流),可以持续发送多个数据
- Future 无需手动关闭,Stream 需要手动关闭
- Future 的所有 API 的返回值仍然是一个 Future 对象,所以可以很方便的进行链式调用
- Future 适用于如网络请求、数据库查询、文件读取和延迟任务等,Stream 适用于如传感器数据、实时推送、键盘输入、轮询请求和定时器等
免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。
相关文章
更多-
- Dart Future 讲清楚:定义、创建方式、组合处理与结果回调
- 时间:2026-08-25
-
- Dart 异步编程:把 Future 的核心用法一次讲清
- 时间:2026-08-24
-
- Java 并发编程之 CompletableFuture 异步编程实战指南
- 时间:2026-08-22
-
- 深入理解 Dart Future:带并发数限制的请求实现原理
- 时间:2026-08-21
-
- Dart异步编程基础入门:Future与async/await详解
- 时间:2026-08-21
-
- CompletableFuture实现线程池管理的方法与实践
- 时间:2026-08-15
-
- WAIC2026上175个早期项目谁将成为下一个AI巨头
- 时间:2026-07-28
-
- 个早期项目亮相WAIC 2026,谁将成为下一个AI巨头?
- 时间:2026-07-28
精选合集
更多大家都在玩
大家都在看
更多-
- 以下哪种食材被称为“地下苹果” 蚂蚁庄园今日答案9.18
- 时间:2026-09-17
-
- 蚂蚁庄园今天答题答案2026年9月18日
- 时间:2026-09-17
-
- 蚂蚁庄园答题今日答案2026年9月18日
- 时间:2026-09-17
-
- 蚂蚁庄园小课堂2026年9月18日最新题目答案
- 时间:2026-09-17
-
- 小鸡答题今天的答案是什么2026年9月18日
- 时间:2026-09-17
-
- 蚂蚁庄园每日答题答案2026年9月18日
- 时间:2026-09-17
-
- 蔬菜洗完掉色,说明是被染色了,是真的吗 蚂蚁庄园今日答案9月18日
- 时间:2026-09-17
-
- 满襟蜡绘花纹巧染就花纹当绣裳说的是哪种传统技艺 蚂蚁新村今日答案2026.9.17
- 时间:2026-09-17
