You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

两个Fragment共享Activity级ViewModel时屏幕旋转数据丢失如何解决

问题原因分析

从你提供的核心代码来看,两个Fragment获取Activity级别ViewModel的写法符合规范,数据丢失的常见原因如下:

  • ViewModel内部数据被意外重置:你省略的Fragment1逻辑中,很可能在onCreateView/onViewCreated等View重建回调里,每次都会给ViewModel内存储的数据集直接赋值初始值(比如本地预置的空列表、测试数据)。屏幕旋转后Fragment1会触发View重建,重新执行View创建逻辑,直接覆盖了之前修改后的ViewModel数据。
  • 修改的是ViewModel数据的临时副本,而非原对象:如果你的ListsViewModel对外暴露数据集的方法返回的是数据集的深拷贝对象,你在Fragment2中修改的只是这个副本,并没有把修改后的结果回写给ViewModel。返回Fragment1时你可能是用临时变量刷新了UI,看起来修改生效,但是ViewModel中实际存储的还是旧数据,旋转后重建UI从ViewModel取数就回到了旧状态。
  • 自定义ViewModel Factory每次返回新实例:如果你的ListsViewModel使用了自定义的ViewModelProvider.Factory,且Factory的create方法逻辑存在问题,每次调用get方法时都会创建一个全新的ListsViewModel实例,那么配置变更后拿到的新ViewModel实例自然没有之前修改的数据。
  • 数据观察逻辑存在时序问题:如果你在Fragment1中对ViewModel数据的观察逻辑位置不对,或者没有使用正确的生命周期所有者(比如误用了Fragment的this而非viewLifecycleOwner作为observe的参数),旋转后重建View时没有收到ViewModel最新数据的通知,看起来像是数据丢失,实际ViewModel中存储的数据是正确的。
排查建议
  • 检查ListsViewModel中存储数据的成员变量的可访问性,建议对外暴露不可变的数据流(比如StateFlow/LiveData),仅在ViewModel内部修改数据,避免外部直接修改数据集带来的意外问题
  • 检查Fragment1的View重建逻辑,确认所有给ViewModel赋值初始值的逻辑都只执行一次(比如放在Fragment的onCreate回调,而非onCreateView等每次View重建都会执行的回调中)
  • 检查ViewModel的Factory实现,确认同一个Activity范围内获取到的ListsViewModel是同一个实例

内容的提问来源于stack exchange,提问作者Ville

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 06:00:05