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]);
相关推荐
火柴就是我1 天前
flutter 之真手势冲突处理
android·flutter
Speed1231 天前
`mockito` 的核心“打桩”规则
flutter·dart
法的空间1 天前
Flutter JsonToDart 支持 JsonSchema
android·flutter·ios
恋猫de小郭1 天前
Android 将强制应用使用主题图标,你怎么看?
android·前端·flutter
玲珑Felone1 天前
从flutter源码看其渲染机制
android·flutter
ALLIN2 天前
Flutter 三种方式实现页面切换后保持原页面状态
flutter
Dabei2 天前
Flutter 国际化
flutter
Dabei2 天前
Flutter MQTT 通信文档
flutter
Dabei2 天前
Flutter 中实现 TCP 通信
flutter
孤鸿玉2 天前
ios flutter_echarts 不在当前屏幕 白屏修复
flutter