Dart逐字符打印函数多次调用异常:Future.delayed问题求助
问题原因
你的代码里,forEach会一次性创建所有延迟任务,每个任务的触发时间是index*50ms。多次调用printFancy时,不同调用的延迟任务会并行执行,导致多个字符串的字符交叉输出;同时stdout.write("\n")会在所有延迟任务执行前就运行,造成换行提前出现。
解决方案
改用async/await让字符输出串行执行,确保每个字符输出后再等待延迟,最后统一换行。这样多次调用时,前一个字符串的所有字符输出完成后才会处理下一个。
修改后的代码:
import 'dart:io'; Future<void> printFancy(String data) async { for (final char in data.split('')) { stdout.write(char); await Future.delayed(const Duration(milliseconds: 50)); } stdout.write('\n'); } // 调用示例 void main() async { await printFancy('Hello World'); await printFancy('I am a Dart beginner'); }
关键改动说明
- 将函数改为
async函数并返回Future<void>,支持await操作 - 用普通
for循环替代asMap().forEach,允许在循环内部使用await实现串行延迟 - 把换行操作移到所有字符输出完成后,避免提前换行
- 调用函数时使用
await,确保多个printFancy调用按顺序执行
内容的提问来源于stack exchange,提问作者The AM
相关产品推荐
相关产品推荐

