我正在尝试在Flutter中创建一个Uint8List,将其放在JSON字符串中,然后将该字符串传递给本机代码。
这是我的Flutter代码:

final jsonObj = {
  "dataBuffer": dataBuffer, // dataBuffer is of type Uint8List
};

String encodedJson = json.encode(jsonObj);

await _channel.invokeMethod('testMethod', <String, dynamic>{
  'jsonObj': encodedJson,
});


这是我尝试从JSON字符串中获取Uint8List作为FlutterStandardTypedData的本地iOS代码:

- (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result {
  if ([@"testMethod" isEqualToString:call.method]) {
    NSString* jsonString = (NSString*)call.arguments[@"jsonObj"];
    NSData* jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];

    NSError *error = nil;
    NSDictionary *responseObj = [NSJSONSerialization
                                 JSONObjectWithData:jsonData
                                 options:0
                                 error:&error];

    if(! error) {
        FlutterStandardTypedData *dataBufferJson = [responseObj objectForKey:@"dataBuffer"];
        NSData *bufferData = [dataBufferJson data]; *** // Here is where the exception is thrown ***
    }
  }
}


当我尝试获取dataFlutterStandardTypedData属性时,出现以下异常:


  'NSInvalidArgumentException',原因:'-[__ NSArrayI数据]:
  无法识别的选择器已发送到实例0x7ff8f21ad000'


我不明白为什么会收到此错误,但我认为这是因为Uint8List已放入JSON中,或者是我试图从中获取FlutterStandardTypedData错误的字典。无论如何,我找不到解决方案。

我还尝试以另一种方式将Uint8List从Flutter传递给本机:在Dart中,我将Uint8List直接传递给本机代码(没有将其封装在JSON字符串中)。这样,我可以成功获取FlutterStandardTypedData对象。这是另一个示例的代码。

飞镖代码:

await _channel.invokeMethod('testMethod',
  dataBuffer, // example Uint8List
);


iOS程式码:

- (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result {
  if ([@"testMethod" isEqualToString:call.method]) {
    FlutterStandardTypedData* dataBuffer = (FlutterStandardTypedData*)call.arguments[@"dataBuffer"];
  }
}


但是我需要通过JSON字符串传递Uint8List

如何将Uint8List从Flutter传递到iOS本机,并将其封装在JSON字符串中?

最佳答案

我猜您正在尝试做的是在Dart原生边界上传递多个“参数”。为此使用Map<String, dynamic>。例如:

await _channel.invokeMethod('testMethod', <String, dynamic>{
    'bytes': dataBuffer, // example Uint8List
    'someBool': true,
    'someInt': 123,
  }
);


在本机端,您将获得一个映射或字典,其中包含键名作为键,而值作为其本机等效项(例如bool-> Boolean等)

10-04 23:36