如何使用 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);
然后实现处理程序。这个处理两个方法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 端,返回值被传递给 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 NSObject
值 FlutterMethodNotImplemented
的 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 直接分享到 Whatsapp