Консольное приложение — StringDecoder stdin

Для терминального ввода было показано следующее или подобное, однако завершение ввода с помощью ctl-d не очень хорошо. Есть ли другой способ выйти из этой «петли»?

import "dart:io";

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

person Brian Oh    schedule 07.05.2013    source источник
comment
когда вы говорите не хорошо, что вы имеете в виду?   -  person jdigital    schedule 08.05.2013
comment
@jdigital. Я просто хочу, чтобы оператор нажал Enter, а затем использовал введенные данные.   -  person Brian Oh    schedule 08.05.2013
comment
Взгляните на эту статью: stackoverflow.com/questions/15440138/   -  person jdigital    schedule 08.05.2013


Ответы (2)


Вы можете завершить программу dart, запустив метод exit при использовании dart: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.

Из документации

Этот код будет проходить внутри проверки в обработчике событий в listen

person Benjamin Gruenbaum    schedule 07.05.2013

На ум приходит несколько вариантов. Во-первых, вы можете использовать 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 ............
  });

Отмена подписки не закрывает поток, поэтому никакой обработчик onDone не вызывается.

Конечно, если вам больше нечего делать, вы всегда можете завершить работу с помощью exit(0) [1].

person Darshan Rivka Whittle    schedule 07.05.2013