控制台应用程序 - StringDecoder stdin

时间:2013-05-07 20:48:45

标签: dart dart-io

对于终端输入显示以下或类似,但是用ctl-d终止输入并不好。还有另一种退出这种“循环”的方法吗?

import "dart:io";

void main() {
  stdout.write("Enter Data : ");
  new StringDecoder().bind(stdin).listen((String sInput){});
////  Do something with sInput ............
}  

2 个答案:

答案 0 :(得分:1)

使用dart时可以通过运行exit方法终止飞镖程序:io

void exit(int status)
Exit the Dart VM process immediately with the given status code.

This does not wait for any asynchronous operations to terminate.
Using exit is therefore very likely to lose data.

From the docs

该代码将在listen

中的事件处理程序中进行检查

答案 1 :(得分:1)

我想到了一些选择。首先,您可以使用takeWhile()设置“已完成”条件:

new StringDecoder().bind(stdin)
  .takeWhile((s) => s.trim() != 'exit')
  .listen((sInput) {

当用户输入onDone字符或类型EOF后跟输入键时,将使用相同的exit处理程序(如果设置了一个)。您可以通过cancel()取消订阅来获得更大的灵活性:

void main() {
  stdout.write("Enter Data : ");
  var sub;
  sub = new StringDecoder().bind(stdin).listen((String sInput) {
    if (sInput.trim() == 'exit' || sInput.trim() == 'bye')
      sub.cancel();
    // Do something with sInput ............
  });

取消订阅不会关闭Stream,因此不会调用任何onDone处理程序。

当然,如果您还有其他事情要做,您可以随时使用exit(0) [1]终止。