如何在Dart CLI中实现按空格键触发显示新随机颜色功能?
实现Dart CLI程序的按键交互(空格刷新颜色、ESC重置)
要在Dart CLI中复刻你给出的Node.js Terminal-kit功能,核心是启用终端原始模式捕获单个按键,并对应处理空格和ESC键的逻辑。以下是具体实现:
核心思路
- 使用
dart:io的stdin切换到原始模式,绕过行缓冲直接捕获按键 - 监听输入字节流,识别空格(ASCII码32)和ESC(ASCII码27)
- 处理按键时先停止监听、恢复终端模式,避免后续输入干扰
- 加入短暂延迟后执行对应逻辑(刷新颜色/重置界面)
完整代码示例
import 'dart:io'; import 'dart:async'; void main() { // 初始化显示颜色 colornew(); // 启动按键监听 startKeyListener(); } void colornew() { // 这里替换成你的随机颜色显示逻辑 final randomColor = '\x1B[38;2;${_rand(256)};${_rand(256)};${_rand(256)}m'; stdout.write('$randomColor随机颜色展示 \x1B[0m\n'); stdout.write('按空格键刷新颜色,按ESC键重置界面\n'); } int _rand(int max) => Random().nextInt(max); void startKeyListener() { // 启用终端原始模式,捕获单个按键 stdin.echoMode = false; stdin.lineMode = false; // 监听输入流 StreamSubscription? subscription; subscription = stdin.listen((List<int> data) { final keyCode = data.first; // 处理空格键(ASCII 32) if (keyCode == 32) { // 停止监听、恢复终端模式 subscription?.cancel(); stdin.echoMode = true; stdin.lineMode = true; // 短暂延迟后刷新颜色 Future.delayed(const Duration(milliseconds: 80), () { colornew(); startKeyListener(); }); } // 处理ESC键(ASCII 27) else if (keyCode == 27) { // 停止监听、恢复终端模式 subscription?.cancel(); stdin.echoMode = true; stdin.lineMode = true; // 清屏(兼容不同终端) stdout.write('\x1B[2J\x1B[H'); // 短暂延迟后回到主逻辑 Future.delayed(const Duration(milliseconds: 80), () { main(); }); } }); }
代码说明
- 终端模式切换:
stdin.echoMode = false关闭输入回显,stdin.lineMode = false关闭行缓冲,确保按键能被立即捕获。 - 按键识别:通过读取输入字节的第一个值判断按键,空格对应32,ESC对应27。
- 资源清理:处理完按键后必须取消订阅、恢复终端模式,否则程序退出后终端会处于异常状态。
- 延迟逻辑:用
Future.delayed替代Node.js的setTimeout,保证界面更新的流畅性。
内容的提问来源于stack exchange,提问作者Elie
相关产品推荐
相关产品推荐

