- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我有一个 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
的文档:
If the future returned by the handler completes with a result, that value is sent back to the platform plugin caller wrapped in a success envelope as defined by the codec of this channel. If the future completes with a PlatformException, the fields of that exception will be used to populate an error envelope which is sent back instead.
但我不明白如何才能获得“包装在由该 channel 的编解码器定义的成功信封中的平台插件调用者”?
最佳答案
我在猜测,但如果我错了请纠正我,setMethodCallHandler
不会返回值,它只会设置一个稍后调用的函数。因此,您不能将 setMethodCallHandler
的返回值用于任何事情。
这实际上意味着您有一种“事件”,您希望将其“转换”为 future 的完成。为此,您使用 Completer
创建并稍后完成 Future
。
Future<String> fun() {
var completer = new Completer<String>();
setMethodCallHandler((MethodCall call) {
completer.complete(call.arguments["arg"]);
}
return completer.future;
}
当您的事件全部来自 futures 或流时,使用 async
函数是有效的,但是当您获得其他类型的事件(如端口事件、I/O 回调或计时器)并且您想要映射它时回到 future /流事件,您可以使用 Completer
来完成 future 或使用 StreamController
将事件添加到流中。
关于dart - 有没有办法从 setMethodCallHandler 获取 Future?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49847513/
我是一名优秀的程序员,十分优秀!