Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/95.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios &引用;[uu NSArrayI数据]:无法识别的选择器“;从字典访问标准类型数据时_Ios_Objective C_Flutter_Dart - Fatal编程技术网

Ios &引用;[uu NSArrayI数据]:无法识别的选择器“;从字典访问标准类型数据时

Ios &引用;[uu NSArrayI数据]:无法识别的选择器“;从字典访问标准类型数据时,ios,objective-c,flutter,dart,Ios,Objective C,Flutter,Dart,我试图在flatter中创建一个Uint8List,将其放入一个JSON字符串中,并将该字符串传递给本机代码。 这是我的颤振代码: final jsonObj = { "dataBuffer": dataBuffer, // dataBuffer is of type Uint8List }; String encodedJson = json.encode(jsonObj); await _channel.invokeMethod('testMethod', <String, d

我试图在flatter中创建一个
Uint8List
,将其放入一个JSON字符串中,并将该字符串传递给本机代码。 这是我的颤振代码:

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

String encodedJson = json.encode(jsonObj);

await _channel.invokeMethod('testMethod', <String, dynamic>{
  'jsonObj': encodedJson,
});
当我尝试获取
标准类型数据
数据
属性时,我得到以下异常:

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

我不明白为什么会出现这个错误,但我认为这是因为
Uint8List
被放在了JSON中,或者是因为我试图以错误的方式从字典中获取
uitttypeddata
。无论如何,我找不到解决办法

我还尝试以另一种方式将
Uint8List
从flatter传递到本机:在Dart中,我将
Uint8List
直接传递到本机代码(不将其封装在JSON字符串中)。通过这种方式,我可以成功地获取
标准类型数据
对象。下面是另一个示例的代码

省道代码:

await _channel.invokeMethod('testMethod',
  dataBuffer, // example Uint8List
);
- (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result {
  if ([@"testMethod" isEqualToString:call.method]) {
    FlutterStandardTypedData* dataBuffer = (FlutterStandardTypedData*)call.arguments[@"dataBuffer"];
  }
}
iOS代码:

await _channel.invokeMethod('testMethod',
  dataBuffer, // example Uint8List
);
- (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result {
  if ([@"testMethod" isEqualToString:call.method]) {
    FlutterStandardTypedData* dataBuffer = (FlutterStandardTypedData*)call.arguments[@"dataBuffer"];
  }
}
但是,我需要通过JSON字符串传递
Uint8List


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

Objective-C没有任何编译时类型安全工具,并将此责任留给开发人员。这里的例外情况是,您试图使用数组对象,就好像它是StandardTypedData对象一样。但在运行时,情况似乎并非如此


我不知道Dart是如何将Uint8List序列化为json的,但看看这个异常,它看起来像是“[3,5,7]”。在Objective-C中反序列化它,会得到一个int数组,而不是一个StandardTypedData。数组中的项可能是StandardTypedData类型。

我猜您试图做的是跨Dart本机边界传递多个“参数”。为此,请使用
Map
。例如:

await _channel.invokeMethod('testMethod', <String, dynamic>{
    'bytes': dataBuffer, // example Uint8List
    'someBool': true,
    'someInt': 123,
  }
);
wait\u channel.invokeMethod('testMethod'){
“bytes”:dataBuffer,//示例Uint8List
“someBool”:没错,
“somint”:123,
}
);

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

您为什么要用JSON包装字节?如您所示,正确的方法是直接传递它。在我的应用程序中,我调用一个本机方法,传入一个存储“Uint8List”和其他属性的对象。为了将这个对象传递给本机代码,我必须将它转换为JSON字符串。它处理数字、字符串、布尔值等。您的API希望如何用JSON表示字节数组?我不知道,但在Android本机代码中,我可以使用Gson成功地将JSON字符串(包含
Uint8List
)转换为Java对象。在Java中,我将
Uint8List
转换为
byte[]
。如果要将JSON在本机端解码回其组件,中间JSON形式的意义是什么?只需将
地图
穿过Dart本机边界即可。映射的每个成员都可以是不同的(受支持的)类型,例如字符串、布尔值、整数、浮点值、字节数组等。那么,如何从JSON字符串中获取“标准类型数据”?我应该将“dataBuffer”提取为一个int数组,然后从该数组中创建一个“FlatterStandardTypeDdata”吗?我不知道Flatter和FlatterStandardTypeDdata做什么,但从Objective-C方面考虑,您需要将json反序列化为一个数组,数组中的每个成员都是int/float(或编号)。只需在代码中放置断点并检查数组中的值类型。我试图从字典中提取数组作为
NSArray
,将其转换为
NSData
对象,然后转换为
standardtypedata
对象,但我无法访问缓冲区的内容,因此我认为已在进程中被破坏。请不要将NSArray转换为NSData。只需访问数组的成员,如arr[0]你会在那里找到一个int或NSNumber。谢谢@Srdr,但我用Richard Heap的答案解决了我的问题。请查看他的答案下的注释。谢谢你的回答。我不能准确地这样做,但我可以尝试传递另一个
映射
(包含
数据缓冲
,这次没有转换为字符串)作为
Map
传递给
invokeMethod
的参数。非常感谢!我按照我在上一篇评论中所说的做了,它解决了我的问题。我没有将JSON转换为字符串并将其作为
Map
传递给
invokeMethod
,而是在iOS中作为一个普通的
NSDictionary
访问它。