我正在使用本机 iOS 应用程序中的一些本机 iOS
ViewController
创建一个 Flutter 插件。
在原生 ViewController
中,我设置了一个 MethodChannel
和一个 MethodCallHandler
,与 Flutter 屏幕中相同。
我在 StandartMessageCodec
和 UIKitView
中使用 FlutterPlatformViewFactory
,它应该支持大多数 iOS 对象类型:
/// 在 iOS 上,消息表示如下: /// /// * 空:零 /// * [布尔]:
/// * [int]:NSNumber numberWithBool:
用于可使用以下方式表示的值 /// 32 位二进制补码;NSNumber numberWithInt:
否则 /// * [双]:NSNumber numberWithLong:
/// * [字符串]:NSNumber numberWithDouble:
/// * [Uint8List]、[Int32List]、[Int64List]、[Float64List]: ///NSString
/// * [列表]:FlutterStandardTypedData
/// * [地图]:NSArray
NSDictionary
当我使用 iOS 面团中的
invokeMethod:argument:result
方法时,我确实将其参数传递给 Flutter,但 iOS 中的结果回调是一个 FlutterError :
pluginChannel.invokeMethod("retrieve_data", arguments: ["selectedVehicleType": selectedVehicleType] as! Any) { (r: Any) in
print("@@ result from retrieve_data method call is: \(r)")
if let error = r as? FlutterError {
print("error is : \n\(error.code), \n\(error.message)")
}
}
错误是: 错误, 可选(“类型'_Map
Flutter 中的 MethodChannel 处理程序:
channel.setMethodCallHandler((call) {
switch (call.method) {
// test call for getting data from API
// this is invoked with "result" parameter on native side which returns an error:
// "type \'_Map<Object?, Object?>\' is not a subtype of type \'Future<dynamic>\'"
case 'retrieve_data':
print(
'## retrieve_data received in NativeScreenExample with args \n ${call.arguments}, \n of type ${call.arguments.runtimeType}');
// test invocation to send data from API to native
dynamic result =
channel.invokeMethod('data_retrieved', 'arg').then((result) {
print(
'## data_retireved method invoked with result data from native: $result');
return result;
});
break;
default:
}
return call.arguments;
});
你能发现设置有问题吗?
我认为,
handler
(这是您在setMethodCallHandler
中设置的回调)应该返回Future
到MethodChannel
正确的工作。
要实现此目的,您应该添加
async
关键字,如下所示:
channel.setMethodCallHandler((call) async {
// your actual code here
}
更改后,我可以在 Xcode 的日志中实现
Success: ["selectedVehicleType": Car]
(我使用 "Car"
作为“selectedVehicleType”)。
希望这有帮助!