当前位置: 首页 > news >正文

iOS/Flutter混合开发之PlatformView配置与使用

环境:Xcode 16.3、Flutter 3.29.2、Dart 3.7.2。

使用背景:需要在flutter界面中嵌入一个iOS原生控件。

步骤:

1. iOS侧实现

        1.1:PlatformView实现

class FLNativeView: NSObject, FlutterPlatformView {private var _view: UIView// flutter侧传入参数private var arguments: Any?init(frame: CGRect,viewIdentifier viewId: Int64,arguments args: Any?,binaryMessenger messenger: FlutterBinaryMessenger?) {_view = UIView()super.init()_view.backgroundColor = UIColor.whitearguments = argscreateNativeView(view: _view)}func view() -> UIView {_view}func createNativeView(view _view: UIView) {let testView = UIView() // 创建需要嵌入的视图constrain(testView) { testView intestView.edges == testView.superview!.edges}}
}

        1.2:FlutterPlatformViewFactory实现

public class FLNativeViewFactory: NSObject, FlutterPlatformViewFactory {private var messenger: FlutterBinaryMessengerpublic init(messenger: FlutterBinaryMessenger) {self.messenger = messengersuper.init()}public func create(withFrame frame: CGRect,viewIdentifier viewId: Int64,arguments args: Any?) -> FlutterPlatformView {FLNativeView(frame: frame,viewIdentifier: viewId,arguments: args,binaryMessenger: messenger)}public func createArgsCodec() -> FlutterMessageCodec & NSObjectProtocol {FlutterStandardMessageCodec.sharedInstance()  // 用于参数编解码}
}

        1.3:FlutterPlugin实现

public class NativeWebViewPlugin: NSObject, FlutterPlugin {static let viewId = "platform-view-test"public static func register(with registrar: FlutterPluginRegistrar) {let factory = FLNativeViewFactory(messenger: registrar.messenger())registrar.register(factory, withId: NativeWebViewPlugin.viewId) // 唯一标识符}
}

        1.4:注册FlutterPlugin(可使用引擎注册、或在FlutterViewController中注册,具体方式结合flutter集成方式和使用场景,这里采用后者)

在目标flutter控制器(需要嵌入原生组件、且继承自FlutterViewController的控制器)中执行注册方法:

    func registrarPlugin() {if !hasPlugin("NativeWebViewPlugin") {let registry = registrar(forPlugin: "NativeWebViewPlugin")registry?.register(FLNativeViewFactory(messenger: binaryMessenger),withId: NativeWebViewPlugin.viewId)}}

2. flutter侧实现

UiKitView(viewType: "platform-view-test",layoutDirection: TextDirection.ltr,creationParams: {'key': 'test'},creationParamsCodec: const StandardMessageCodec(),
);

相关文章:

  • 记录一次无界微前端的简单使用
  • Ubuntu 上手动安装 Go 环境并解决“可执行文件格式错误”
  • Mac「brew」快速安装Redis
  • 输入电抗器和输出电抗器的作用-杭州干扰净电子科技
  • 二叉树的遍历(广度优先搜索)
  • Springboot 手搓 后端 滑块验证码生成
  • 【GCC bug】libstdc++.so.6: version `GLIBCXX_3.4.29‘ not found
  • ES历史版本下载
  • uniapp-商城-36-shop 购物车 选好了 进行订单确认2 支付方式颜色变化和颜色滤镜filter
  • 高级java每日一道面试题-2025年4月25日-基础篇[反射篇]-在运行时,如何判断某个类是否实现了特定的接口或扩展了某个父类?
  • 算力网络(CFN)在跨校联合科研中的应用:安全性挑战与联邦调度实践
  • 《Keras 3 :使用 TFServing 提供 TensorFlow 模型》
  • PWNOS:2.0(vulnhub靶机)
  • 前端技术Ajax实战
  • 06-stm32时钟体系
  • 企业部署Power BI 报表服务器,在第三方系统嵌套该报表服务器,并实现单点登录
  • 【linux】Chrony服务器
  • HTML 详解:从基础结构到语义标签
  • 【音视频】⾳频处理基本概念及⾳频重采样
  • NAT地址转换
  • 伊朗外长: 美伊谈判进展良好,讨论了很多技术细节
  • 博物馆有一项活动40岁以上不能参加?馆方回应
  • 商务部就海外社交平台上发布从所谓中国“代工厂”低价购买国际知名品牌事答问
  • “归雁经济”能带来什么?川大商学院调研团队深入乡村与返乡青年人才交流
  • 2024年上海发生科技融资997起,位于全国第一
  • 股市劝服马斯克