native - 如何使用 MethodChannel 从 native 平台调用应用程序的 Dart 部分中的方法?

标签 native flutter platform

我正在编写一个原生插件,在某些情况下,它必须调用应用程序的 Flutter 部分中的函数,该插件是用 Dart 编写的。 它是如何实现的,解释如下: https://flutter.io/platform-channels/

此外,这里是从本地/平台部分向 Dart/非本地调用方法的示例: https://github.com/flutter/plugins/tree/master/packages/quick_actions

现在,这个例子非常好,以防平台只需要调用一个方法,即调用不返回任何内容/void,但如果它需要调用一个 function,即需要来自非原生/Dart 部分的返回值,我无法在互联网上找到示例或文档。我相信它可以实现,因为在 native Java 部分,有一个方法:

public void invokeMethod(String method, Object arguments, MethodChannel.Result callback)

所以,有一个 callback 对象可以从非本地部分返回值——或者,我在这里弄错了,目前没有办法从非本地部分返回值- 应用程序的原生 Dart 部分?

最佳答案

签名是void setMethodCallHandler(Future<dynamic> handler(MethodCall call)) , 所以我们需要在 Dart 端提供一个返回 Future<dynamic> 的函数,例如 _channel.setMethodCallHandler(myUtilsHandler);

然后实现处理程序。这个处理两种方法 foobar分别返回Stringdouble .

  Future<dynamic> myUtilsHandler(MethodCall methodCall) async {
    switch (methodCall.method) {
      case 'foo':
        return 'some string';
      case 'bar':
        return 123.0;
      default:
        throw MissingPluginException('notImplemented');
    }
  }

在 Java 端,返回值被传递给 success Result 的方法回调。

channel.invokeMethod("foo", arguments, new Result() {
  @Override
  public void success(Object o) {
    // this will be called with o = "some string"
  }

  @Override
  public void error(String s, String s1, Object o) {}

  @Override
  public void notImplemented() {}
});

在 Swift 中,返回值是一个 Any?传递给了 result关闭。 (未实现由任何参数作为常量 NSObjectFlutterMethodNotImplemented 发出信号。)

channel.invokeMethod("foo", arguments: args, result: {(r:Any?) -> () in
  // this will be called with r = "some string" (or FlutterMethodNotImplemented)
})

关于native - 如何使用 MethodChannel 从 native 平台调用应用程序的 Dart 部分中的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54474802/

相关文章:

ios - 如何在 React Native 中获取 iOS 版本?

Android/iOS : How to create a web-app, 使用原生组件?

flutter - 如何改变主题数据?

navigation - 如何正确设置基于身份验证的导航

android-studio - 在Flutter中显示ListView的内容并显示从图库上传的图像

c# - 控制台应用程序平台始终为 "Active(x86)"

android - 关于Flutter中的Gradle和Android平台

java - 加载测试内存问题

android - 如何获取android的native方法源代码

Gradle:在构建静态库时包含一个对象 .o 文件