You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dart主函数监听Stream打印data.length(不使用await-for)的问题

Dart监听文件流后程序直接退出的解决方法(不使用await-for)

问题描述

我希望监听文件数据流并打印每次读取的data.length,但程序因同步执行直接退出,输出Exited (1)。现有代码如下:

void main() async {
  final file = File('assets/text_long.txt');
  final stream = file.openRead();

  stream.listen(
    (data) {
      print(data.length);
    },
  );
}

问题原因

main函数虽标记为async,但调用stream.listen()后未等待数据流处理完成。listen()仅注册回调函数,不会阻塞当前执行流程,main函数执行完毕后程序直接退出,此时数据流还未完成读取。

解决方案

方法1:使用StreamSubscription.asFuture()

listen()返回的StreamSubscription提供asFuture()方法,该方法返回一个Future:当数据流正常结束时Future完成,若数据流出错则Future抛出错误。通过await这个Future,可让main函数等待数据流处理完成。

修改后的代码:

void main() async {
  final file = File('assets/text_long.txt');
  final stream = file.openRead();

  // 监听流并等待其完成
  await stream.listen(
    (data) {
      print(data.length);
    },
    onError: (error) => print('读取文件出错: $error'),
  ).asFuture();
}

方法2:使用Completer手动控制等待逻辑

创建Completer对象,在数据流的onDone回调中完成Completer,在onError回调中标记错误,最后await该Completer的future来阻塞main函数。

修改后的代码:

void main() async {
  final file = File('assets/text_long.txt');
  final stream = file.openRead();
  final completer = Completer<void>();

  stream.listen(
    (data) {
      print(data.length);
    },
    onDone: () => completer.complete(),
    onError: (error) => completer.completeError('读取失败: $error'),
  );

  await completer.future;
}

内容的提问来源于stack exchange,提问作者zex_rectooor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 19:07:00