1
我要求用户输入我的命令行(dart:io)应用程序。在得到用户的回答后,我想退订Stream
。然后,我可能想再听一遍(但与不同的听众,所以pause()
和resume()
不帮助我)。如何在Dart中使用新的Streams API执行stdin.close()?
在启动时,我有这样的:
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
流?
谢谢!虽然这条线似乎不适用于结束标准输入。在调用'cmdLineSubscription.cancel()'后,我可以再次订阅(所以,这是有效的),但在程序退出时,stdin仍然处于活动状态并等待输入。我想知道'cancel()'是否会传播到已转换为当前流的流(如在stdin - > cmdLine中)。 – filiph 2013-03-04 08:33:34
好吧,我只是试图用一张干净的纸张复制这个问题,并且无法做到,所以问题在其他地方。 'cmdLineSubscription.cancel();'即使它被转换,也会关闭'stdin',因为它应该。感谢你的回答! – filiph 2013-03-08 14:53:58