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では、stdinはでありStream、それらにはメソッドがありませんclose

私がやっていることは、変換されたストリームを閉じて(読み取り:サブスクライブを解除して)、生の(stdin)ストリームを開いたままにしておくことだと思います。

私は正しいですか?もしそうなら、どうすればstdinプログラム終了時に基になるストリームを閉じることができますか?

4

1 に答える 1

1

終了するにstdinは、登録を解除するだけです。

cmdLineSubscription.cancel();

これはそれを行うのと同等の方法です。だからあなたの直感は正しかった。質問を理解したかどうかはわかりません-このアプローチに問題がありましたか?

于 2013-03-03T23:54:36.913 に答える