当前位置: 首页 > 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(),
);
http://www.xdnf.cn/news/134965.html

相关文章:

  • 第12章 微调生成模型
  • 实时交互式AIGC系统开发:打造多模态数字人全栈解决方案
  • 41.缺失的第一个正数(java)
  • jQuery AJAX、Axios与Fetch
  • YOLO12架构优化——引入多维协作注意力机制(MCAM)抑制背景干扰,强化多尺度与小目标检测性能
  • 深入理解指针(4)
  • Centos7.2安装Xmap
  • 【git#4】分支管理 -- 知识补充
  • 【AI落地应用实战】借助 Amazon Q 实现内容分发网络(CDN)CDK 构建的全流程实践
  • 图像预处理-图像亮度变换
  • U8G2在PC端模拟(C语言版本)
  • 【神经网络与深度学习】训练集与验证集的功能解析与差异探究
  • 【器件专题1——IGBT第1讲】IGBT:电力电子领域的 “万能开关”,如何撑起新能源时代?
  • deepseek-r1-671B满血版,全栈式智能创作平台 - 多模态大模型赋能未来创作
  • 云服务器centos 安装hadoop集群
  • pcd2pgm的launch文件实现
  • 使用yolo用python检测人脸
  • 第三方库与工具:响应式编程RxJava与Flow原理剖析
  • Video-LLaVA
  • Milvus(7):Schema、主字段和自动识别
  • 新!在 podman-machine-default 中安装 CUDA、cuDNN、Anaconda、PyTorch 等并验证安装
  • html中margin的用法
  • express的模板handlebars用app.engine()创建配置和用exphbs.create()的区别
  • 汽车零配件供应商如何通过EDI与主机厂生产采购流程结合
  • 单机无穷大系统暂态稳定性仿真Matlab模型
  • 全球玻璃纸市场深度洞察:环保浪潮下的材料革命与产业重构(2025-2031)
  • C++ 类及函数原型详解
  • HTML word属性
  • 巴西kwai短视频推广旅游广告获客营销策略
  • 如何本地无损放大图片保持高清画质