You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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();
      });
    }
  });
}

代码说明

  1. 终端模式切换:stdin.echoMode = false关闭输入回显,stdin.lineMode = false关闭行缓冲,确保按键能被立即捕获。
  2. 按键识别:通过读取输入字节的第一个值判断按键,空格对应32,ESC对应27。
  3. 资源清理:处理完按键后必须取消订阅、恢复终端模式,否则程序退出后终端会处于异常状态。
  4. 延迟逻辑:用Future.delayed替代Node.js的setTimeout,保证界面更新的流畅性。

内容的提问来源于stack exchange,提问作者Elie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 05:03:21