一尘不染

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

flutter

我正在编写一个本机插件,在某些情况下,它必须在应用程序的Flutter部分中调用用Dart编写的函数。如何实现,在这里进行了说明:https : //flutter.io/platform-channels/

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

现在,如果平台仅需要调用a method,即该调用不返回内容/ ,则此示例确实很好,但是如果平台需要void调用a
function,即需要从非本机/ Dart部分返回的值,则我不能在互联网上找到了示例或文档。我相信可以实现,因为在本机Java部分中,有一种方法:

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

因此,有一个callback对象可能具有非本地部分的返回值-或,我在这里错了,目前没有办法从应用程序的非本地Dart部分返回值?


阅读 306

收藏
2020-08-13

共1个答案

一尘不染

签名是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闭包的。(未实现通过any参数表示const
NSObject值来发出信号FlutterMethodNotImplemented。)

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