You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 01:42:37