如何通过Platform Views在Flutter应用中托管Windows平台原生视图?
Flutter Windows 平台嵌入原生视图(Platform Views)相关解答
官方适配进展
- 截止当前Flutter稳定版(3.22及之前版本),Windows端Platform Views没有正式的官方支持,相关功能还在主线分支开发中。目前核心的视图挂载、基础布局同步、基础手势透传逻辑已经写完,但还存在多窗口适配异常、高DPI下坐标偏移、混合渲染层级冲突等未解决的已知问题,官方暂时没有公布明确的正式版上线时间。
- 官方最终上线的实现会保持和Android、iOS端一致的Dart层API,后续正式发布后,你之前写完的Android、iOS端插件Dart层代码不需要大改,只需要补充Windows端的原生视图注册逻辑即可。如果想提前尝鲜,可以切换到Flutter master分支找到相关的预览实现,但不要把预览版用到生产环境,API随时可能出现破坏性调整。
可用的第三方实现与自主适配方案
- 目前社区生产环境验证最多的方案是基于Win32窗口句柄的嵌入逻辑,不需要引入额外的重量级依赖:在Windows插件注册阶段,通过
FlutterDesktopViewGetHWND接口拿到Flutter渲染窗口的HWND句柄,按照Dart侧传过来的布局参数创建对应位置、尺寸的Win32原生子窗口,同时监听Flutter侧的页面滚动、控件位移、透明度变化事件,同步调整原生子窗口的状态即可。目前社区多个包含原生WebView、硬件加速视频渲染、原生输入法输入框的Windows Flutter插件都是基于这套逻辑实现的。 - 如果要嵌入的是WinUI 3控件,不需要依赖第三方库,直接通过Windows App SDK提供的窗口互操作接口,把WinUI 3内容挂载为Flutter渲染窗口的子元素,自己处理好Dart侧和原生侧的坐标映射、事件拦截逻辑就能跑通。
- 所有非官方实现都有一个通用限制:如果Flutter页面中存在使用独立Surface渲染的控件(比如Windows版官方
video_player、早期版本的Windows WebView实现),嵌入的原生视图会被渲染层遮挡,需要手动调整渲染层的混合模式才能正常显示。
临时方案提示:如果你的插件不需要把原生视图和Flutter控件做复杂的层叠混合,直接用弹出原生窗口的方式实现功能成本更低,稳定性也更好,不需要做完整的Platform Views适配。
内容的提问来源于stack exchange,提问作者KonTash
相关产品推荐
相关产品推荐

