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

Flutter集成iOS UIImageView时无法传递参数求助

解决Flutter向iOS原生UIKitView传递参数时args为nil的问题

问题根源

你的FLNativeViewFactory没有实现createArgsCodec()方法,Flutter端传递参数时使用了StandardMessageCodec,但iOS工厂类默认未提供对应编解码器,导致参数无法正确解析,最终args为nil。

修复步骤

在FLNativeViewFactory中添加createArgsCodec()方法,返回与Flutter端一致的StandardMessageCodec:

修改后的iOS工厂类代码:

class FLNativeViewFactory: NSObject, FlutterPlatformViewFactory {
    private var messenger: FlutterBinaryMessenger

    init(messenger: FlutterBinaryMessenger) {
        self.messenger = messenger
        super.init()
    }

    func create(
        withFrame frame: CGRect,
        viewIdentifier viewId: Int64,
        arguments args: Any?
    ) -> FlutterPlatformView {
        return FLNativeView(
            frame: frame,
            viewIdentifier: viewId,
            arguments: args,
            binaryMessenger: messenger)
    }
    
    // 新增方法,返回对应编解码器
    func createArgsCodec() -> FlutterMessageCodec & NSObjectProtocol {
        return FlutterStandardMessageCodec.sharedInstance()
    }
}

可选优化:动态生成二维码

修复参数传递后,可将二维码内容替换为Flutter端传递的参数,实现动态生成:

修改FLNativeView代码:

class FLNativeView: NSObject, FlutterPlatformView {
    private var _view: UIView
    private var qrText: String = "Hello"
    
    init(
        frame: CGRect,
        viewIdentifier viewId: Int64,
        arguments args: Any?,
        binaryMessenger messenger: FlutterBinaryMessenger?
    ) {
        _view = UIView()
        super.init()
        
        if let args = args as? Dictionary<String, Any>,
           let textValue = args["text"] as? String {
            debugPrint(textValue)
            qrText = textValue
        } else {
            debugPrint("参数解析失败")
        }
        
        createNativeView(view: _view)
    }
    
    func view() -> UIView {
        return _view
    }
    
    func createNativeView(view _view: UIView){
        let imageView = UIImageView()
        imageView.frame = CGRect(x: 0, y: 0,width: 100,height: 100)
        // 使用传递的参数生成二维码
        imageView.image = generateQRCode(from: qrText)
        _view.addSubview(imageView)
    }
    
    func generateQRCode(from string: String) -> UIImage? {
        let data = string.data(using: String.Encoding.ascii)
        
        if let filter = CIFilter(name: "CIQRCodeGenerator") {
            filter.setValue(data, forKey: "inputMessage")
            let transform = CGAffineTransform(scaleX: 3, y: 3)
            
            if let output = filter.outputImage?.transformed(by: transform) {
                return UIImage(ciImage: output)
            }
        }
        
        return nil
    }
}

内容的提问来源于stack exchange,提问作者BraveEvidence

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 01:25:26