我要求用户在我的命令行(dart:io)应用程序中输入。在我从用户那里得到答案后,我想取消订阅Stream
。然后,稍后,我可能想再听一遍(但是用不同的听众,所以pause()
和resume()
对我没有帮助)。
在启动时,我有这个:
cmdLine = stdin
.transform(new StringDecoder());
之后,当我想收集输入时:
cmdLineSubscription = cmdLine.listen((String line) {
try {
int optionNumber = int.parse(line);
if (optionNumber >= 1 && optionNumber <= choiceList.length) {
cmdLineSubscription.cancel();
completer.complete(choiceList[optionNumber - 1].hash);
} else {
throw new FormatException("Number outside the range.");
}
} on FormatException catch (e) {
print("Input a number between 1 and ${choiceList.length}, please.");
}
});
按预期工作,但它在程序执行结束时使stdin
打开。使用以前的API,关闭stdin
就像调用stdin.close()
一样简单。但是在新的API中,stdin
是一个Stream
,并且它们没有close
方法。
我认为我正在做的是关闭(读取:取消订阅)转换后的流,但保留原始(stdin)流打开。
我说的对吗?如果是这样,我如何在程序退出时关闭底层stdin
流?
要关闭stdin
,只需取消订阅:
cmdLineSubscription.cancel();
这是做它的等效方法。所以你的直觉是对的。我不确定我是否理解了这个问题——这种方法有问题吗?