我正在尝试在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 ***
}
}
}
当我尝试获取
data
的FlutterStandardTypedData
属性时,出现以下异常:'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
等)