为何Dart程序未打印'wow'?是否为异步行为?代码遗漏了什么?
为什么你的代码看起来没打印'wow'?
首先得澄清:你的代码实际上是会打印'wow'的,如果没看到,大概率是两个原因:要么是程序进入无限循环后终端输出没及时刷新,要么是你误解了代码的执行顺序——你可能以为print('wow')会在Future.doWhile循环结束后才执行,但实际上它是同步代码,会在循环启动后立刻执行。
具体来说,Future.doWhile()的执行逻辑是:
- 先同步执行一次回调函数(检查
name是否非空,此时name是空的,返回true); - 把下一次回调调度到Dart的微任务队列中,然后立即返回一个
Future对象; - 紧接着你的
print('wow')就会同步执行,所以'wow'应该已经被打印了,只是后续无限循环的微任务可能让你忽略了这条输出。
这确实属于Dart的异步行为
没错,Future.doWhile是Dart的异步API。虽然第一次回调是同步执行的,但后续的每次回调都是通过scheduleMicrotask异步调度的,整个循环的完成是依赖事件循环的微任务队列来实现的,完全符合Dart的异步模型。
你代码里遗漏的关键问题
- 没有读取用户输入更新
name:你的代码只检查name是否非空,但从来没有从控制台获取用户输入来修改name,导致name.isNotEmpty永远为false,循环永远不会终止,程序会一直跑下去。 - 没有按需等待异步循环完成:如果你期望
print('wow')在循环结束后执行,你需要用await等待Future.doWhile的Future完成(但现在循环永远不会结束,所以加了await后print('wow')永远不会执行)。 - 缺少输入处理逻辑:你需要添加读取控制台输入的代码,比如用异步的
stdin监听来获取用户输入并更新name,这样循环才能正常终止。
举个修复后的示例:
import 'dart:async'; import 'dart:convert'; import 'dart:io'; import 'package:pedantic/pedantic.dart'; bool _asking = false; String name = ''; Future main() async { await askUserName(); } Future askUserName() async { _asking = true; print('enter the name'); // 异步监听用户输入 unawaited(stdin.transform(utf8.decoder).listen((input) { name = input.trim(); })); await Future.doWhile(() { if (name.isNotEmpty) { _asking = false; print('thank you'); exit(0); } return _asking; }); print('wow'); // 现在会在循环结束后执行 }
内容的提问来源于stack exchange,提问作者Yadhu
相关产品推荐
相关产品推荐

