1

我要求用户在我的命令行 (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,stdinis a Stream,而那些没有该close方法。

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

我对么?如果是这样,我如何stdin在程序退出时关闭底层流?

4

1 回答 1

1

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

cmdLineSubscription.cancel();

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

于 2013-03-03T23:54:36.913 回答