代码之家  ›  专栏  ›  技术社区  ›  2beens

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

  •  50
  • 2beens  · 技术社区  · 6 年前

    我正在编写一个本机插件,在某些情况下,它必须调用应用程序颤振部分的函数,用Dart编写。 如何实现这一目标,如下所述: https://flutter.io/platform-channels/

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

    现在,如果平台只需要调用 method ,即该调用不返回任何结果/ void ,但如果需要调用 function ,即需要非本机/Dart部分的返回值,我在internet上找不到示例或文档。但我相信它是可以实现的,因为在本机Java部分,有一种方法:

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

    所以,有一个 callback 对象可能具有来自非本地部分的返回值,或者,我在这里搞错了,目前无法从应用程序的非本地Dart部分返回值?

    1 回复  |  直到 4 年前
        1
  •  56
  •   Richard Heap    4 年前

    签名为 void setMethodCallHandler(Future<dynamic> handler(MethodCall call)) ,因此我们需要在Dart端提供一个返回 Future<dynamic> 例如 _channel.setMethodCallHandler(myUtilsHandler);

    然后实现处理程序。这个可以处理两种方法 foo bar 分别返回 String double

      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参数发出信号 NSObject 价值 FlutterMethodNotImplemented .)

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