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

Future<String> fun() async {

  return setMethodCallHandler((MethodCall call) {
    return () async {return call.arguments["arg"];}();
  });
}

我想要做的是,如果call.argument返回“abc”,
var a = await fun();
a将等于“abc”

我发现的唯一信息是setMethodCallHandler上的文档:



但是我不明白如何获得“该通道的编解码器定义的成功封装了平台插件的调用程序”?

最佳答案

我正在猜测,但是如果我错了,请更正我,setMethodCallHandler不返回值,它仅设置一个稍后调用的函数。
因此,您不能将setMethodCallHandler的返回值用于任何内容。

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

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

当所有事件都来自将来或流时,使用async函数就可以使用,但是当您获得其他类型的事件(例如端口事件,I / O回调或计时器)并且想要将其映射回将来/流事件时,可以使用Completer函数可以使用StreamController完成将来的操作,也可以使用ojit_code将事件添加到流中。

关于dart - 有没有办法从setMethodCallHandler获取Future?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49847513/

10-12 02:35