how to return a string from a function which is li

2019-07-19 18:00发布

问题:

i have a function called foo which is listening to the stdout, what i want is to return some string which i got from stdout. here is my function;

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

I want to return s1 to the calling function

回答1:

This should do what you want

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

Your custom code either returns a valid value or null. I changed listen to map to be able to use additional stream methods. where filters invalid values (null) and returns the first non-null value.

The caller of the foo method needs to handle the returned Future (using for example async/await) to get the value when it becomes available.

Use it like

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


回答2:

here a callback function do the trick

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

and here i am calling the method and printing the data which i get get from stream.

foo(process,(data){print(data);})


标签: dart stdout