Dart中如何清除控制台先前打印的行实现单行进度更新
Dart 控制台单行动态刷新实现方法
要实现动态进度条、覆盖上一行打印内容的效果,核心靠控制台转义字符\r(回车符):它的作用是把光标直接移动到当前行的起始位置,后续输出的内容会直接覆盖当前行已有内容,不会产生新行。
普通的print()方法默认会在所有输出内容的末尾自动追加换行符\n,会把光标推到下一行,所以没法直接用来实现行覆盖效果,需要用dart:io提供的stdout.write()方法输出——这个方法不会自动追加换行符,光标会停在输出内容的末尾。
改造后的示例代码
import 'dart:io'; void main() { // 替换成你的实际业务列表 final taskList = List.generate(100, (index) => index); int completedCount = 0; for (var item in taskList) { completedCount++; // 核心:开头加\r把光标拉回行首,直接输出最新进度覆盖旧内容 stdout.write( '\r${(completedCount / taskList.length * 100).toStringAsFixed(0)}%', ); // 这里放你的实际业务处理逻辑 sleep(const Duration(milliseconds: 50)); } // 进度走完后必须手动补一个换行,否则后续输出会接在进度行末尾 print(''); print('所有任务处理完成'); }
注意事项
- 绝大多数系统自带终端、VS Code/Android Studio等IDE的内置控制台都原生支持
\r转义,只有极少数老旧终端会显示异常 - 如果后续输出的内容长度比上一行短,需要在内容末尾补足够的空格,覆盖上一行残留的字符,避免显示错乱
- 不要尝试给
print()传带\r的内容实现效果,print()自动追加的换行符会强制光标跳到下一行,无法实现行内覆盖 - 进度执行完成后一定要手动调用一次
print('')输出换行,否则后续所有打印内容都会和最后一行进度拼在同一行
内容的提问来源于stack exchange,提问作者Gad D Lord
相关产品推荐
相关产品推荐

