如何从一个正在侦听dart流中的函数返回一个字符串?

时间:2018-06-07 09:59:47

标签: dart stdout

我有一个名为foo的函数正在监听stdout,我想要的是返回一些我从stdout获得的字符串。这是我的功能;

    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返回给调用函数

3 个答案:

答案 0 :(得分:1)

这里有一个回调函数来做技巧

 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);})

答案 1 :(得分:0)

这应该做你想要的事情

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(使用例如async / await)以获取值可用时的值。

一样使用它
bar() async {
  ...
  var input = await foo(proc);
  print(input);
}

答案 2 :(得分:-1)

我认为每个人都想要这个:

import 'dart:io';
import 'dart:convert';

// Using system encoding:
var outputStr = await process.stdout.transform(systemEncoding.decoder).join();

// Using UTF-8 encoding:
var outputStr = await process.stdout.transform(utf8.decoder).join();