AndroidViewModel在Fragment切换时无法保留状态问题咨询
问题
原本认为只要Fragment隶属于同一个Activity,ViewModel就应该在Fragment切换时保留状态与数据,但实际情况并非如此。
我的ViewModel代码如下:
public class MainViewModel extends AndroidViewModel { public MainViewModel(@NonNull Application application) { super(application); Log.d("MainViewModel","constructor called"); } }
在Fragment中获取ViewModel的代码:
MainViewModel viewModel = new ViewModelProvider(this).get(MainViewModel.class);
我发现每次请求ViewModel时都会调用构造方法。我以为ViewModel的作用是一直存活,可用于在Fragment间保留状态。请问我是否用法有误?我的预期是否错误?该如何在Fragment间保留状态?
解答
你的预期是对的,ViewModel确实可以在同属一个Activity的Fragment间共享状态,但你的用法存在错误。
问题核心在于获取ViewModel时传入的生命周期所有者:你用this(当前Fragment实例)作为参数,这会让ViewModel绑定到单个Fragment的生命周期,当Fragment销毁重建时,ViewModel也会随之重建,所以每次切换Fragment都会触发构造方法调用。
要实现Fragment间的状态共享,你需要将ViewModel绑定到它们所属的Activity的生命周期,获取ViewModel时传入Activity实例即可:
// 在Fragment中获取绑定到Activity的ViewModel MainViewModel viewModel = new ViewModelProvider(requireActivity()).get(MainViewModel.class);
这样ViewModel会跟随Activity的生命周期存活,只要Activity未被销毁,同属该Activity的所有Fragment获取到的都是同一个ViewModel实例,就能在Fragment切换时保留状态与数据。
内容的提问来源于stack exchange,提问作者user1785730
相关产品推荐
相关产品推荐

