【问题标题】:Is there a way to get the Future from setMethodCallHandler?有没有办法从 setMethodCallHandler 获取 Future?
【发布时间】:2018-09-25 14:45:24
【问题描述】:

我有一个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上的文档:

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

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

【问题讨论】:

  • 您能否提供更多背景信息?你想达到什么目的?你在什么情况下使用setMethodCallHandler
  • @GünterZöchbauer 是否更清楚?
  • 并非如此。 setMethodCallHandlerMethodChannel docs.flutter.io/flutter/services/MethodChannel/… 的一种方法(您从中复制了引用),但您的代码声明了一个新的 setMethodCallHandler 函数,该函数似乎与 MethodChannel 无关。对我来说,不清楚您问题中代码的目的是什么。

标签: dart flutter


【解决方案1】:

我在猜测,但如果我错了,请纠正我,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 将事件添加到流中。

【讨论】:

    猜你喜欢
    • 2019-09-11
    • 2021-12-17
    • 2014-05-30
    • 2020-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-02
    • 2020-02-29
    相关资源
    最近更新 更多