有没有办法从 setMethodCallHandler 获取 Future?

Cha*_*ler 1 dart flutter

我有一个setMethodCallHandler从我的 Java 代码运行回调的,我希望它设置一个包含结果的 Future。就像是

Future<String> fun() async {

  return setMethodCallHandler((MethodCall call) {
    return () async {return call.arguments["arg"];}();
  });
}
Run Code Online (Sandbox Code Playgroud)

我想要做的是如果 call.argument 将返回“abc”,

var a = await fun();
Run Code Online (Sandbox Code Playgroud)

a 将等于“abc”

我找到的唯一信息是关于setMethodCallHandler以下内容的文档:

如果处理程序返回的 future 以结果完成,则该值被发送回平台插件调用者,包装在此通道的编解码器定义的成功信封中。如果未来以 PlatformException 完成,则该异常的字段将用于填充错误信封,该信封被发送回。

但我不明白如何将“平台插件调用者包装在此频道的编解码器定义的成功信封中”?

lrn*_*lrn 5

我在猜测,但如果我错了,请纠正我,setMethodCallHandler它不会返回值,它只会设置一个稍后调用的函数。因此,您不能将 的返回值setMethodCallHandler用于任何事情。

这实际上意味着您有一种“事件”,您希望将其“转换”为未来的完成。为此,您可以使用 aCompleter创建并稍后完成一个Future.

Future<String> fun() {
  var completer = new Completer<String>();
  setMethodCallHandler((MethodCall call) {
    completer.complete(call.arguments["arg"]);
  }
  return completer.future;
}
Run Code Online (Sandbox Code Playgroud)

async当您的事件全部来自期货或流时,使用函数是有效的,但是当您获得其他类型的事件(如端口事件、I/O 回调或计时器)并且您想将其映射回未来/流事件时,您可以使用Completer完成未来或StreamController将事件添加到流中。