Android ViewModel无法在Fragment切换时保留状态问题求助
解决Fragment间共享ViewModel数据丢失的问题
嘿,这个问题我之前踩过同款坑!核心问题就出在你获取ViewModel的作用域上,咱们一步步捋清楚:
为什么数据会丢失?
你现在用的是ViewModelProviders.of(this).get(...),这里的this指向当前Fragment对象。ViewModel的生命周期是和它的所有者绑定的——每个Fragment都会拥有自己独立的ViewModel实例。当你切换Fragment(比如用replace操作),原来的Fragment可能被销毁,对应的ViewModel也会被系统回收;新创建的Fragment又会初始化一个全新的ViewModel,自然就找不到之前存储的数据了。
正确的实现方式
要让两个Fragment共享同一个ViewModel,需要把ViewModel的所有者改成它们所属的Activity,这样ViewModel的生命周期就和Activity绑定,只要Activity没销毁,ViewModel就会一直存在,数据也能完整保留。
修改你的ViewModel获取代码:
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 把this换成getActivity()或者requireActivity() interventionViewModel = ViewModelProviders.of(getActivity()).get(InterventionsViewModel.class); // 如果你用的是新版Jetpack库(更推荐),可以用ViewModelProvider的构造方法: // interventionViewModel = new ViewModelProvider(requireActivity()).get(InterventionsViewModel.class); }
额外注意事项
- 确保你的
InterventionsViewModel继承自ViewModel(而非AndroidViewModel,除非你需要Application上下文):public class InterventionsViewModel extends ViewModel { // 你的LiveData定义和业务逻辑代码 } - 如果你使用Navigation Component进行Fragment导航,还可以绑定到导航图的作用域(用
getViewModelStoreOwner()),不过Activity作用域是跨Fragment共享数据最通用的方案。
内容的提问来源于stack exchange,提问作者Matthieu Meunier
相关产品推荐
相关产品推荐

