【发布时间】:2020-01-19 21:40:27
【问题描述】:
我正在尝试在 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,
});
这是原生 iOS 代码,我尝试在其中将 Uint8List 作为 FlutterStandardTypedData 从 JSON 字符串中取出:
- (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 ***
}
}
}
当我尝试获取 FlutterStandardTypedData 的 data 属性时,出现以下异常:
'NSInvalidArgumentException',原因:'-[__NSArrayI 数据]: 无法识别的选择器发送到实例 0x7ff8f21ad000'
我不明白我收到此错误的原因,但我认为这是因为Uint8List 已放入 JSON 中,或者我正在尝试获取 @ 987654329@ 以错误的方式从字典中获取。反正我找不到解决办法。
我还尝试以另一种方式将 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 字符串中?
【问题讨论】:
-
您想在 JSON 中包装字节的原因是什么?如您所见,正确的做法是直接传递。
-
在我的应用程序中,我调用了一个本地方法,传入一个存储“Uint8List”和其他属性的对象。为了将此对象传递给本机代码,我必须将其转换为 JSON 字符串。
-
字节数组并没有真正的 JSON 表示。它处理数字、字符串、布尔值等。您的 API 如何希望以 JSON 表示的字节数组?
-
我不知道,但在 Android 本机代码中,我可以使用 Gson 成功地将 JSON 字符串(包含
Uint8List)转换为 Java 对象。在 Java 中,我将Uint8List转换为byte[]。 -
如果您在本机端将 JSON 解码回其组成部分,那么中间 JSON 形式的意义何在?只需将
Map<String, dynamic>传递到 Dart-native 边界即可。映射的每个成员都可以是不同的(支持的)类型,例如字符串、布尔值、整数、浮点数、字节数组等。
标签: ios objective-c flutter dart