如何使用 MethodChannel 从本机平台调用应用程序的 Dart 部分中的方法?
How to call methods in Dart portion of the app, from the native platform using MethodChannel?
我正在编写一个本机插件,在某些情况下,它必须调用应用程序的 Flutter 部分中的函数,用 Dart 编写。
它是如何实现的,解释如下:
https://flutter.io/platform-channels/
此外,这里是从 native/platform 部分向 Dart/non-native 调用方法的示例:
https://github.com/flutter/plugins/tree/master/packages/quick_actions
现在,这个例子非常好,以防平台只需要调用 method
,即调用 returns nothing/void
,但万一它需要调用 function
,即需要 non-native/Dart 部分的 return 值,我无法在互联网上找到示例或文档。我相信它可以实现,因为在原生 Java 部分,有一个方法:
public void invokeMethod(String method, Object arguments, MethodChannel.Result callback)
所以,有一个 callback
对象可能有来自非本地部分的 return 值 - 或者,我在这里弄错了,目前没有办法 return从应用程序的非原生 Dart 部分获取值?
签名是void setMethodCallHandler(Future<dynamic> handler(MethodCall call))
,所以我们需要在Dart端提供一个returns Future<dynamic>
的函数,比如_channel.setMethodCallHandler(myUtilsHandler);
然后实现处理程序。这个处理两个方法 foo
和 bar
returning 分别 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 端,return 值被传递给 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 中,return 值是一个 Any?
传递给 result
闭包。 (未实现由作为 const NSObject
值 FlutterMethodNotImplemented
的任何参数发出信号。)
channel.invokeMethod("foo", arguments: args, result: {(r:Any?) -> () in
// this will be called with r = "some string" (or FlutterMethodNotImplemented)
})
我正在编写一个本机插件,在某些情况下,它必须调用应用程序的 Flutter 部分中的函数,用 Dart 编写。 它是如何实现的,解释如下: https://flutter.io/platform-channels/
此外,这里是从 native/platform 部分向 Dart/non-native 调用方法的示例: https://github.com/flutter/plugins/tree/master/packages/quick_actions
现在,这个例子非常好,以防平台只需要调用 method
,即调用 returns nothing/void
,但万一它需要调用 function
,即需要 non-native/Dart 部分的 return 值,我无法在互联网上找到示例或文档。我相信它可以实现,因为在原生 Java 部分,有一个方法:
public void invokeMethod(String method, Object arguments, MethodChannel.Result callback)
所以,有一个 callback
对象可能有来自非本地部分的 return 值 - 或者,我在这里弄错了,目前没有办法 return从应用程序的非原生 Dart 部分获取值?
签名是void setMethodCallHandler(Future<dynamic> handler(MethodCall call))
,所以我们需要在Dart端提供一个returns Future<dynamic>
的函数,比如_channel.setMethodCallHandler(myUtilsHandler);
然后实现处理程序。这个处理两个方法 foo
和 bar
returning 分别 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 端,return 值被传递给 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 中,return 值是一个 Any?
传递给 result
闭包。 (未实现由作为 const NSObject
值 FlutterMethodNotImplemented
的任何参数发出信号。)
channel.invokeMethod("foo", arguments: args, result: {(r:Any?) -> () in
// this will be called with r = "some string" (or FlutterMethodNotImplemented)
})