Как вернуть строку из функции, которая слушает поток в дротике? - PullRequest
0 голосов
/ 07 июня 2018

У меня есть функция с именем foo, которая слушает стандартный вывод, и я хочу вернуть некоторую строку, полученную из стандартного вывода.вот моя функция;

    dynamic foo(process) {
  return (
    process.stdout.transform(UTF8.decoder).listen((data) {
    String s = data.toString();
    // print(s);
    if (s.contains("received event of")) {
      var s1 = s.split(":");

      print("${s1[1]}");
      return s1[1];
    }
  }));
}

Я хочу вернуть s1 вызывающей функции

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

здесь функция обратного вызова делает свое дело

 foo(process, callback) {
    process.stdout.transform(UTF8.decoder).listen((data) {
      String s = data.toString();
      if (s.contains("received event of")) {
        String message = s.split(":")[1];
        callback(message);
      }
    });
  }

и здесь я вызываю метод и распечатываю данные, которые я получаю из потока.

foo(process,(data){print(data);})
0 голосов
/ 07 июня 2018

Это должно делать то, что вы хотите

Future<String> dynamic foo(process) {
  return process.stdout.transform(UTF8.decoder).map((data) {
    String s = data.toString();
    // print(s);
    if (s.contains("received event of")) {
      var s1 = s.split(":");

      print("${s1[1]}");
      return s1[1];
    } else {
      return null;
    }
  }).where((val) => val != null).first;
}

Ваш пользовательский код либо возвращает допустимое значение, либо null.Я изменил listen на map, чтобы иметь возможность использовать дополнительные методы потока.where фильтрует недопустимые значения (null) и возвращает первое не null значение.

При вызове метода foo необходимо обработать возвращенное значение Future (используя, например, * 1014).* / await) чтобы получить значение, когда оно станет доступным.

Используйте его как

bar() async {
  ...
  var input = await foo(proc);
  print(input);
}
...