从命令行Dart应用程序接收“隐藏”输入的最佳方法是什么?例如,在Bash中,这可以通过以下方式完成:
read -s SOME_VAR
将io.stdin.echoMode
设置为false:
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命令,因此不需要期货带来的复杂性。
您键入时,代码还会执行'*'的经典输出。
如果您正在做很多cli工作,则下面的代码来自我正在使用的dshell软件包dshell。看看“询问”方法。
https://pub.dev/packages/dshell
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);
}