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

Posted

技术标签:

【中文标题】如何使用 MethodChannel 从本机平台调用应用程序的 Dart 部分中的方法?【英文标题】:How to call methods in Dart portion of the app, from the native platform using MethodChannel? 【发布时间】:2018-10-15 16:39:36 【问题描述】:

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

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

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

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

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

【问题讨论】:

你能看看这个 - ***.com/questions/63581385/… 吗? 【参考方案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 端,返回值被传递给 Result 回调的 success 方法。

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 中,返回值是传递给 result 闭包的 Any?。 (未实现由 const NSObjectFlutterMethodNotImplemented 的 any 参数发出信号。)

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

【讨论】:

谢谢!你有任何示例代码可以从 ios、Swift 调用吗?非常感谢! @Tom - 添加了 Swift 示例 @RichardHeap 当添加不活跃时会这样吗?比如android alarmmanager触发广播接收器的时候? @DavidPapirov 要传递列表,请使用平台等效项 - 例如对于 Java 使用 ArrayList。将其作为 args 参数传递 - 请参阅 ***.com/questions/57035150/… 请注意,您不能传递任意对象,除非它在消息编解码器支持的类型列表中(例如字符串、映射等)。您可以将任意对象转换为受支持项目的地图或 JSON,或编写自定义编解码器。 @DavidPapirov 另见:***.com/questions/61507418/…

以上是关于如何使用 MethodChannel 从本机平台调用应用程序的 Dart 部分中的方法?的主要内容,如果未能解决你的问题,请参考以下文章

Flutter MethodChannel分析

如何将参数从 Flutter 传递给 Kotlin?

Flutter MethodChannel 直接分享到 Whatsapp

升级flutter后创建方法通道-无法解析方法getFlutterView()

如何从 Cordova 插件添加本机视图

如何将 void* 的引用从 C++/CLI 传递给本机 C 函数