2013-05-07 4 views
0

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

import "dart:io"; 

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

, когда вы говорите «не хорошо», что вы имеете в виду? – jdigital

+0

@jdigital. Я просто хочу, чтобы «оператор» ударил «enter», а затем использовал введенные данные. –

+0

Взгляните на эту статью: http://stackoverflow.com/questions/15440138/how-to-read-console-input-on-m3-dart – jdigital

ответ

1

Вы можете прервать программу дротика, выполнив метод 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

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

Смежные вопросы