news 2026/11/6 5:16:27

Flutter 开始支持 Jetpack Compose Platform View

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Flutter 开始支持 Jetpack Compose Platform View

PR #195523 居然开始支持 Jetpack Compose 的ComposeView了,看起来是 Flutter 在给默认FlutterActivity补齐 AndroidX 的三个 ViewTree Owner,让 Compose 能找到生命周期、状态恢复和 ViewModel 的宿主。

理论上后面应该会直接支持 Compose 放进 HC、TLHC、VD 和 HCPP 四个场景里里面。

其实之前用 AndroidView 接 ComposeView 一直不太行,比如一个 Flutter App 要复用 Android 团队写好的 Compose 设备控制面板,然后 Flutter 侧放一个AndroidView(viewType: 'device_controls'),原生插件通过PlatformViewFactory创建ComposeView,再用setContent { DeviceControls() }绘制界面。

一般来说普通 Android View 到这里就能显示了,但 Compose 在创建 Composition 时,还需要沿着当前 View 的父层级查找 AndroidX 提供的宿主信息。

这里需要三个 Owner:

  • LifecycleOwner告诉 Compose 宿主什么时候启动、暂停和销毁

  • SavedStateRegistryOwner提供状态保存和恢复入口

  • ViewModelStoreOwner让 Compose 里的 ViewModel 有地方存放和复用

问题是,Flutter 默认的FlutterActivity直接继承的是 AndroidActivity,虽然它很早就实现了LifecycleOwner,但是一直没有把它发布到 DecorView 的 ViewTree 上,也没有提供完整的 SavedStateRegistry 和 ViewModelStore。

也就是 ComposeView 往上查,就可能遇到ViewTreeLifecycleOwner not found,之前在普通 ViewTree 下,可以通过FlutterFragmentActivity或者手动提供 Owner 来解决部分场景,因为它继承的FragmentActivity本身就具备 AndroidX 这些能力。

不过这次算是开始正式扶正了,看草稿,这次FlutterActivity新增SavedStateRegistryOwner、ViewModelStoreOwner接口,然后在setContentView(createFlutterView())之后,把三个 Owner 设置到 DecorView。

同时onCreate()会在 Lifecycle 进入ON_CREATE前恢复 SavedStateRegistry,onSaveInstanceState()负责保存,而 ViewModelStore 会通过onRetainNonConfigurationInstance()尝试跨旋转等配置变更复用,Activity 真正销毁时再清理。

大概情况类似:

Compose 需要的对象以前默认 FlutterActivity 的问题这次补上的能力
LifecycleOwnerActivity 有生命周期,但 ViewTree 不一定能查到发布到 DecorView
SavedStateRegistryOwner缺少 AndroidX 状态保存入口接入 Activity 的保存与恢复
ViewModelStoreOwner缺少 ViewModel 作用域创建、复用和清理 ViewModelStore

这里的 SavedState 是 AndroidX 的机制,和 Flutter Widget 自己通过 Restoration Channel 恢复状态是两条路径。

真正麻烦的是 Virtual Display

而且只补FlutterActivity还不够,Virtual Display 这个老古董还在服役呢,而不同的 Platform View 合成方式,Android View 所处的位置并不一样。

HC、TLHC 和 HCPP 的这组场景里,ComposeView 可以沿所在的 Android ViewTree 找到宿主,但 Virtual Display 会把原生 View 放进SingleViewPresentation,那是一个单独的 Window,和 Activity 的 DecorView 没有共同的父 View。

也就是就算 DecorView 已经设置了 Owner,里面的 ComposeView 还是看不到:

所以 PR 新增了ViewTreeOwners:

在创建 Presentation 的时候,通过ViewTreeOwners.findFrom(flutterView)读取当前 FlutterView 能找到的三个 Owner,再在SingleViewPresentation.onCreate()的setContentView(rootView)之前调用installOn(rootView)。

这样 ComposeView 附着到虚拟窗口的时候,也可以沿自己的父 View 往上找,就能从 Presentation 根节点找到对应的宿主。

另外比如你还缓存了一个 FlutterEngine,先把它挂在 Activity A,A 退出以后再把同一个 Engine 挂到 Activity B,这种场景也需要兼容,要是 Owner 在 Platform View 首次创建时就永久缓存,那 B 里的 ComposeView 可能还拿着已经销毁的 A 的 Lifecycle。

所以这个 PR 用回调在 Presentation 创建和重新创建时获取当前 FlutterView 的 Owner,resize和resetSurface()路径也会重新设置,避免后面一直绑定旧宿主。

从目前提交的情况看,估计赶不上下个月的新版本,不过 2027 的版本应该没问题。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/6 5:13:20

大模型本地部署完全指南:从 Ollama 到 vLLM

本地部署大模型,先记住一个三层架构——模型层(Llama/Qwen/DeepSeek 权重)→ 推理引擎层(Ollama / llama.cpp / vLLM / LMDeploy)→ 交互层(CLI / WebUI / API)。个人体验用 Ollama Open WebUI…

作者头像 李华
网站建设 2026/11/6 5:11:23

稳定CAD自动化的秘密:CAD-MCP防数据丢失与可靠性设计详解

【免费下载链接】CAD-MCP CAD MCP Server 项目地址: https://gitcode.com/gh_mirrors/ca/CAD-MCP 点击查看 免费下载 CAD-MCP 是一个让 AI 通过自然语言驱动 AutoCAD / 浩辰CAD / 中望CAD 进行绘图的 MCP 服务器。当 AI 接管 CAD 操作后,最让人担心的不…

作者头像 李华
网站建设 2026/11/6 5:10:21

REA 逆向分析工具安装指南:如何装好 rea 并把它接入 AI 智能体

REA 逆向分析工具安装指南:如何装好 rea 并把它接入 AI 智能体 【免费下载链接】rea Reverse engineer anything with agents, from app behavior down to native binaries. 项目地址: https://gitcode.com/GitHub_Trending/rea2/rea 这是一份面向新手的 REA…

作者头像 李华
网站建设 2026/11/6 5:10:02

如何运行用Python编写的程序

如何运行用编写的程序这篇文章在这里要向大家去说明关于如何把那个用自己编写的代码去运行的情况, 小编这边觉得这个方式还算是挺实用的一个状态, 所以就拿过来给大家分享给大家去学习了, 期待着各位在阅读完了本文之后能够对你们产生一定的帮助, 废话这里就不过多说了, 接着就…

作者头像 李华