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
相关产品推荐
相关产品推荐

