Flutter Future 和 Stream 的区别

Flutter Future 和 Stream 的区别

Future 一次性异步操作

  • 用于表示一个尚未完成的异步操作的结果,承诺最终会返回一个值(或错误),适用于如网络请求、数据库查询、文件读取和延迟任务等
  • Future 无需手动关闭

使用 async 创建 Future

dart 复制代码
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

dart 复制代码
fetchData()
  .then((value) => ("Result: $value")) //成功回调
  .catchError((error) => print("Error: $error")); //失败错误处理
  .whenComplete(() => print("Task done")); //完成回调,不管成功或失败都会执行

通过 async 和 await 来使用 Future

dart 复制代码
void gainData() async {
  try {
    String data = await fetchData();
    print(data);
  } catch (e) {
    print("Error: $e");
  }
}

Stream 连续异步事件流

  • 用于表示一系列异步事件的序列(数据流),可以持续发送多个数据(或错误),适用于如传感器数据、实时推送、键盘输入、轮询请求和定时器等
  • Stream 需要手动关闭

使用 StreamController 创建 Stream

dart 复制代码
//StreamController 用于管理流的创建、发送数据和关闭
StreamController<String> streamController = StreamController<String>();
//
streamController.sink.add("Data 1");
streamController.sink.add("Data 2");

使用 async* 创建 Stream

dart 复制代码
Stream<String> fetchDataStream() async* {
  for (int i = 0; i < 3; i++) {
    await Future.delayed(const Duration(seconds: 1)); //模拟异步耗时
    yield "Data $i"; //生成发送数据
  }
}

通过 listen 监听 Stream 的事件

dart 复制代码
streamController.stream.listen((value) {
    print("Value: $value");
  });
//
streamController.stream.listen(
  (data) => print("Received: $data"), //数据回调
  onError: (error) => print("Error: $error"), //错误回调(可选)
  onDone: () => print("Stream completed"), //完成回调(可选)
);
dart 复制代码
//不再需要发送数据后要手动关闭
streamController.close();

Future 转换为 Stream

dart 复制代码
//使用 Stream.fromFuture 将单个 Future 转为流(发送一次数据后完成)
Future<String> futureData = fetchData();
Stream<String> streamData = Stream.fromFuture(futureData);
//转换多个 Future
Stream<String> streamData2 = Stream.fromFutures([futureData,futureData2]);
相关推荐
好的佩奇5 小时前
Dart 之类型系统
flutter·dart
恋猫de小郭11 小时前
Dart 3.15 新特性:this 终于支持类型提升了
android·前端·flutter
FungLeo1 天前
成为全栈·Flutter App 篇·主题与可访问性:深浅色、大字号和触控体验
flutter·移动开发·深色模式·可访问性·成为全栈·大字号适配
用户95421573334852 天前
只是选个照片,怎么留下了这么多访问记录?Flutter 图片选择器排查与优化实录
flutter
FungLeo2 天前
成为全栈·Flutter App 篇·第四批复盘:复用了什么,移动端又新增了什么
flutter·移动开发·跨端开发·成为全栈·api契约·全栈复盘
jason.zeng@15022072 天前
使用vscode+flutter开发android程序(入门)
android·vscode·flutter
jason.zeng@15022072 天前
Flutter 项目标准分层目录(repository/dto/page,对齐后端思想)
flutter
程序员老刘4 天前
跨平台开发地图 | 2026年10月
flutter·ai编程·客户端
林瞅瞅4 天前
Flutter 开发环境从零搭建与调试记录
flutter
FungLeo4 天前
成为全栈·Flutter App 篇·Markdown 编辑器:编辑、预览与离开保护
flutter·移动开发·markdown编辑器·表单设计·成为全栈·草稿保存