2013-03-03 55 views
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,stdinStream,而那些没有close方法。

我认为我正在做的是关闭(读取:取消订阅)转换的流,但保持原始(stdin)流打开。

我正确吗?如果是这样,我怎样才能关闭程序退出底层stdin流?

回答

1

要关闭stdin,你只是取消订阅:

cmdLineSubscription.cancel(); 

这是做它的等效方式。所以你的直觉是对的。我不确定我是否理解这个问题 - 这种方法是否存在问题?

+1

谢谢!虽然这条线似乎不适用于结束标准输入。在调用'cmdLineSubscription.cancel()'后,我可以再次订阅(所以,这是有效的),但在程序退出时,stdin仍然处于活动状态并等待输入。我想知道'cancel()'是否会传播到已转换为当前流的流(如在stdin - > cmdLine中)。 – filiph 2013-03-04 08:33:34

+0

好吧,我只是试图用一张干净的纸张复制这个问题,并且无法做到,所以问题在其他地方。 'cmdLineSubscription.cancel();'即使它被转换,也会关闭'stdin',因为它应该。感谢你的回答! – filiph 2013-03-08 14:53:58

相关问题