读取 CLI Dart 应用程序的 'hidden' 个输入

Read 'hidden' input for CLI Dart app

从命令行 Dart 应用程序接收 'hidden' 输入的最佳方式是什么?例如,在 Bash 中,这是通过以下方式完成的:

read -s SOME_VAR

io.stdin.echoMode设为假:

import 'dart:io' as io;

void main() {
  io.stdin.echoMode = false;

  String input = io.stdin.readLineSync();

  // or 

  var input;
  while(input != 32) {
    input = io.stdin.readByteSync();
    if(input != 10)  print(input);
  }

  // restore echoMode
  io.stdin.echoMode = true;
}

这是一个稍微扩展的版本,主要区别在于它使用 finally 块来确保在代码执行时抛出异常时重置模式。 该代码还使用 waitFor 调用(仅在 dart cli 应用程序中可用)将此代码转换为同步调用。鉴于这是一个 cli 命令,因此不需要 futures 给 table.

带来的复杂性

该代码还会在您键入时执行经典输出“*”。

如果您经常使用 cli,下面的代码来自我正在开发的名为 dcli 的 dart 包。看看 'ask' 方法。

https://pub.dev/packages/dcli

  String readHidden() {
    var line = <int>[];

    try {
      stdin.echoMode = false;
      stdin.lineMode = false;
      int char;
      do {
        char = stdin.readByteSync();
        if (char != 10) {
          stdout.write('*');
          // we must wait for flush as only one flush can be outstanding at a time.
          waitFor<void>(stdout.flush());
          line.add(char);
        }
      } while (char != 10);
    } finally {
      stdin.echoMode = true;
      stdin.lineMode = true;
    }

    // output a newline as we have suppressed it.
    print('');
    return Encoding.getByName('utf-8').decode(line);
  }