我怎么能做stdin.close()与新的流API在Dart



我要求用户在我的命令行(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();

这是做它的等效方法。所以你的直觉是对的。我不确定我是否理解了这个问题——这种方法有问题吗?

相关内容

  • 没有找到相关文章

最新更新