尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

深入flutter-elinux的PlatformView实现:flutter_elinux包与native_texture_view示例剖析

深入flutter-elinux的PlatformView实现:flutter_elinux包与native_texture_view示例剖析 深入flutter-elinux的PlatformView实现flutter_elinux包与native_texture_view示例剖析【免费下载链接】flutter-elinuxFlutter tools for embedded Linux (eLinux)项目地址: https://gitcode.com/gh_mirrors/fl/flutter-elinuxflutter-elinux 是 Flutter 面向嵌入式 LinuxeLinux的非官方扩展工具链其flutter_elinux包完整实现了PlatformView 平台视图机制——允许在 Flutter 界面中嵌入原生 Linux 视图并通过纹理Texture合成绘制到界面上。本文通过包内源码与native_texture_view官方示例带你一次看懂 eLinux 平台 PlatformView 的完整实现链路适合想给嵌入式设备写 Flutter 应用的新手参考。 什么是 PlatformView为什么它重要在纯 Dart 世界之外的场景——比如调用原生相机、播放硬件加速视频、渲染 DRM 内容——Flutter 需要一块画给原生世界的区域。PlatformView 就是这块区域Dart 侧声明一个视图槽位原生侧创建真正的视图对象再把视图的每一帧画面注册为 GPU 纹理由 Flutter 引擎按TextureLayer贴回画面。flutter-elinux 支持 Wayland、X11、DRM/GBM、EGLStream 等多种显示后端其 C 嵌入层负责窗口、渲染表面与输入事件管理 flutter_elinux 包PlatformView 的三层实现flutter_elinux包位于 packages/flutter_elinux/lib/widgets.dart统一导出三个分层的 PlatformView 实现1️⃣ Widgets 层ELinuxView 与 ELinuxViewSurfacepackages/flutter_elinux/lib/src/widgets/platform_view.dart 中的ELinuxView是面向使用者的核心组件用法与 Android 的AndroidView完全对齐传入viewType原生侧注册的工厂名State 会自动申请视图 ID、创建控制器并处理焦点与布局方向。packages/flutter_elinux/lib/src/widgets/platform_view.dart 的ELinuxViewSurface则配合PlatformViewLink使用它根据控制器返回的requiresViewComposition自动选择纹理合成或平台图层合成两种路径。2️⃣ Services 层控制器与消息通道packages/flutter_elinux/lib/src/services/platform_views.dart 的PlatformViewsServiceELinux.initELinuxView()负责创建ELinuxViewController底层通过SystemChannels.platform_views消息通道与原生侧通信。抽象基类ELinuxViewControllerplatform_views.dart定义了关键生命周期setSize()首次设置尺寸时才真正触发原生视图创建返回值是纹理缓冲区的实际大小可能与请求尺寸不同textureId原生侧注册纹理后返回的 IDDart 渲染层靠它找到画面dispatchPointerEvent()把 Flutter 的PointerEvent转换为原生 MotionEvent 并批量下发实现手势透传。3️⃣ Rendering 层把纹理画回屏幕packages/flutter_elinux/lib/src/rendering/platform_view.dart 的RenderELinuxView在paint阶段执行核心操作context.addLayer(TextureLayer( rect: offset _currentTextureSize!, textureId: _viewController.textureId!, ));TextureLayer让 Flutter 引擎每帧把原生侧写入的纹理贴到指定矩形上这正是 PlatformView 纹理模式合成方案的本质。另外paint()中还有一处值得注意的细节当纹理尺寸大于控件尺寸时会先做裁剪避免异步缩放期间画面被拉伸见 platform_view.dart。️ 实战native_texture_view 示例剖析官方示例位于 packages/flutter_elinux/examples/platform_views/native_texture_view/它演示了纯原生绘制纹理的完整闭环一个不断滚动的彩色条纹ColorBar画面。Dart 侧三行代码声明一个平台视图lib/native_texture_view.dart 使用PlatformViewLink声明视图槽位onCreatePlatformView回调中调用initELinuxView创建控制器并触发create()viewType plugins.flutter.io/native_texture_view—— 这个字符串是 Dart 与 C 之间唯一的接头暗号creationParams通过StandardMessageCodec编码传给原生工厂。C 侧工厂注册 → 视图创建 → 纹理注册① 插件入口注册工厂native_texture_view_plugin.cc 中FlutterDesktopRegisterPlatformViewFactory把 viewType 字符串与NativeTextureViewFactory绑定——此后 Dart 每次创建视图嵌入层都会回调工厂。② 工厂产出视图对象native_texture_view_factory.cc 的Create()接收 viewId、宽高和参数返回NativeTextureView实例。③ 视图内部注册像素缓冲纹理native_texture_view.cc 是整个示例的灵魂ColorBarTexture维护一块 1024×640 的 RGBA 像素缓冲每次CopyBuffer都会让色条循环偏移一格模拟动画用flutter::PixelBufferTexture包装该缓冲RegisterTexture交给TextureRegistrar得到的纹理 ID 通过SetTextureId()回传给引擎——这就是 Dart 侧textureId的来源Touch()回调中调用MarkTextureFrameAvailable通知引擎新帧就绪引擎随后可拉取纹理绘制。这套工厂 视图 纹理注册模式正是你在 templates/plugin/ 插件模板基础上开发自己的 eLinux 平台插件时的标准骨架。 快速运行这个示例git clone https://gitcode.com/gh_mirrors/fl/flutter-elinux.git sudo mv flutter-elinux /opt/ export PATH$PATH:/opt/flutter-elinux/bin接着把示例pubspec.yaml中flutter_elinux的path改为你本地的包路径见 README.md启动 Wayland 合成器后即可flutter-elinux run -d elinux-wayland 小结层次关键文件职责Widgetswidgets/platform_view.dart声明视图槽位、管理焦点Servicesservices/platform_views.dart生命周期与消息通道Renderingrendering/platform_view.dartTextureLayer 纹理合成原生插件native_texture_view.cc注册纹理、生产画面帧一句话理解 flutter-elinux 的 PlatformViewDart 声明槽位 → 工厂创建原生视图 → 纹理 ID 回传 → TextureLayer 合成画面 → 手势经通道透传回原生五步构成完整的嵌入闭环。掌握这条链路你就能在自己的嵌入式设备上嵌入任意原生渲染内容了。【免费下载链接】flutter-elinuxFlutter tools for embedded Linux (eLinux)项目地址: https://gitcode.com/gh_mirrors/fl/flutter-elinux创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表