如何 return 来自正在监听 dart 中某些流的函数的字符串?

how to return a string from a function which is listening some stream in dart?

我有一个名为 foo 的函数,它正在监听标准输出,我想要的是 return 我从标准输出获得的一些字符串。这是我的功能;

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

我想return s1 到调用函数

这应该可以满足您的需求

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

您的自定义代码 returns 有效值或 null。 我将 listen 更改为 map 以便能够使用其他流方法。 where 过滤无效值 (null) 和 returns 第一个非 null 值。

foo 方法的调用者需要处理返回的 Future(例如使用 async/await)以在可用时获取值。

像使用它

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

这里有一个回调函数可以解决问题

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

我想每个人都想要这个:

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