我该怎么办stdin.close()在DART新的流API?(How can I do stdin.

2019-10-17 18:25发布

我询问用户输入我的命令行(镖: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的程序退出流?

Answer 1:

要关闭stdin ,只需取消订阅:

cmdLineSubscription.cancel();

这是做它的等效方式。 所以,你的直觉是正确的。 我不知道如果我的理解这个问题 - 在那里用这种方法有问题?



文章来源: How can I do stdin.close() with the new Streams API in Dart?