我有一个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 完成,则该异常的字段将用于填充错误信封,该信封被发送回。
但我不明白如何将“平台插件调用者包装在此频道的编解码器定义的成功信封中”?
我在猜测,但如果我错了,请纠正我,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将事件添加到流中。
| 归档时间: |
|
| 查看次数: |
2247 次 |
| 最近记录: |