Flutter使用iOS原生控件

第一步,创建一个平台View(继承FlutterPlatformView)

import WebKit
import Flutter

class MyWKWebView: NSObject, FlutterPlatformView {
    private var webView: WKWebView
    private var frame: CGRect

    init(frame: CGRect, viewIdentifier id: Int64, args: Any?, messenger: FlutterBinaryMessenger) {
        self.frame = frame
        webView = WKWebView(frame: frame)
        super.init()
        
        if let dict = args as? Dictionary<String, Any>,
            let urlString = dict["url"] as? String,
            let url = URL(string: urlString) {
            webView.load(URLRequest(url: url))
        }
    }

    func view() -> UIView {
        return webView
    }
}

第二步,创建一个工厂类(继承FlutterPlatformViewFactory)

import UIKit
import Flutter

class MyWKWebViewFactory: 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 {
        print("aaa111", args)
        return MyWKWebView(frame: frame, viewIdentifier: viewId, args: args, messenger: messenger)
    }
    
    // 必须实现这个方法,create才能接受参数
    func createArgsCodec() -> FlutterMessageCodec & NSObjectProtocol {
        return FlutterStandardMessageCodec.sharedInstance()
    }
}

里面有一个坑,就是Flutter给UIView传递参数时,需要实现createArgsCodec方法,否则无法接受到参数

参考文章:Flutter插件开发踩坑记

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容