Flutter向iOS方法通道传递uint8list参数报错如何解决
iOS平台通道jp2转jpeg类型转换报错修复
报错信息
Could not cast value of type 'FlutterStandardTypedData' (0x1fac3c3d8) to 'NSArray' (0x1fac372b0).
原问题代码
...}else if(call.method == "convertJp2"){ self.convertJp2(call.arguments as! [UInt8], result: result) }.... func convertJp2(_ imageBytes: [UInt8], result: FlutterResult){ let image = UIImage(data:Data(imageBytes)) if let data = image?.jpegData(compressionQuality: 0.8) { let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask) let filename = paths[0].appendingPathComponent("copy.jpeg") try? data.write(to: filename) result(filename) } }
错误原因
Flutter 标准消息编解码器传递二进制Uint8List数据时,iOS侧接收到的原生类型是FlutterStandardTypedData,不是Swift数组类型[UInt8]。代码中直接强制将参数转为[UInt8]时,底层会尝试将对象桥接为NSArray,和实际的FlutterStandardTypedData类型不匹配,因此触发类型转换崩溃。
正确实现代码
方法调用分支修正
} else if call.method == "convertJp2" { guard let imageTypedData = call.arguments as? FlutterStandardTypedData else { result(FlutterError(code: "INVALID_ARG", message: "传入参数不是合法的图像字节数据", details: nil)) return } self.convertJp2(imageTypedData.data, result: result) }
转换方法修正
func convertJp2(_ imageData: Data, result: FlutterResult){ // 解码jp2图像 guard let image = UIImage(data: imageData) else { result(FlutterError(code: "DECODE_ERR", message: "jp2格式图像解码失败", details: nil)) return } // 转jpeg数据 guard let jpegData = image.jpegData(compressionQuality: 0.8) else { result(FlutterError(code: "ENCODE_ERR", message: "jpeg编码失败", details: nil)) return } // 写入沙盒 let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask) let fileUrl = paths[0].appendingPathComponent("copy.jpeg") do { try jpegData.write(to: fileUrl) // 返回字符串路径,Flutter侧可直接使用 result(fileUrl.path) } catch { result(FlutterError(code: "WRITE_ERR", message: "文件写入失败:\(error.localizedDescription)", details: nil)) } }
注意点
- 二进制数据传递不要做
[UInt8]的强转,直接取FlutterStandardTypedData的data属性即可,省去数组转Data的额外开销,也不会触发类型错误。 - 全链路添加错误兜底,避免解码、编码、写入环节失败时,Flutter侧永久等待平台通道返回结果。
- 返回文件路径时传递字符串类型的path,不要直接传NSURL对象,避免Flutter侧接收到无法识别的对象类型。
内容的提问来源于stack exchange,提问作者Didjey
相关产品推荐
相关产品推荐

