FlutterError 可选(“类型\'_Map<Object?, Object?>\'不是类型\'Future<dynamic>\'的子类型”)当使用来自iOS的invokeMethod:argument:result时

问题描述 投票:0回答:1

我正在使用本机 iOS 应用程序中的一些本机 iOS

ViewController
创建一个 Flutter 插件。 在原生
ViewController
中,我设置了一个
MethodChannel
和一个
MethodCallHandler
,与 Flutter 屏幕中相同。 我在
StandartMessageCodec
UIKitView
中使用
FlutterPlatformViewFactory
,它应该支持大多数 iOS 对象类型:

/// 在 iOS 上,消息表示如下: /// /// * 空:零 /// * [布尔]:

NSNumber numberWithBool:
/// * [int]:
NSNumber numberWithInt:
用于可使用以下方式表示的值 /// 32 位二进制补码;
NSNumber numberWithLong:
否则 /// * [双]:
NSNumber numberWithDouble:
/// * [字符串]:
NSString
/// * [Uint8List]、[Int32List]、[Int64List]、[Float64List]: ///
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'不是类型'Future'的子类型”)

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;
    });

你能发现设置有问题吗?

ios flutter flutter-plugin flutter-platform-channel
1个回答
0
投票

我认为,

handler
(这是您在
setMethodCallHandler
中设置的回调)应该返回
Future
MethodChannel
正确的工作。

要实现此目的,您应该添加

async
关键字,如下所示:

channel.setMethodCallHandler((call) async {
   // your actual code here
}

更改后,我可以在 Xcode 的日志中实现

Success: ["selectedVehicleType": Car]
(我使用
"Car"
作为“selectedVehicleType”)。

希望这有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.