位置:首页 > Dart > Dart中Future与Stream的区别及使用场景

Dart中Future与Stream的区别及使用场景

时间:2026-08-21  |  作者:怪兽小助手  |  阅读:0

Dart Future 和 Stream 的区别

  • Dart 中使用 Future 和 Stream 编写异步任务

Future 单次异步结果

  • 用于表示一个尚未完成的异步操作的结果,承诺最终会返回一个值(或错误),适用于如网络请求、数据库查询、文件读取和延迟任务等
  • Future 无需手动关闭
  • Future 的所有 API 的返回值仍然是一个 Future 对象,所以可以很方便的进行链式调用

Future 适合处理单次异步结果。

例如网络请求、数据库查询、文件读取和延迟任务,都可以使用 Future。

使用 async 创建 Future

Dart Future 和 Stream 的区别

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 适用于如传感器数据、实时推送、键盘输入、轮询请求和定时器等

免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。

相关文章

更多

精选合集

更多

大家都在玩

热门话题

大家都在看

更多