【发布时间】:2020-09-20 12:03:18
【问题描述】:
我有一个ViewModel,我目前正在使用它来包含数据并在片段之间共享值。此模型还有助于在活动开始时为应用实例化数据。
我现在正尝试在我的应用程序中添加状态保存功能,但我对如何将两个系统合并在一起感到困惑。 android 文档提到使用这个构造函数:
public MyViewModel(SavedStateHandle savedStateHandle) {
mState = savedStateHandle;
}
但是,我不确定状态是如何传递的,以及这个构造函数是如何在活动中使用的(这是我的用法):
myViewModel = new ViewModelProvider(requireActivity()).get(myViewModel.class);
无论如何,由于我还需要实例化数据以防 saveState 为空,所以我不确定该部分如何适应。作为参考,这里是我的 ViewModel 类的概要:
public class myViewModel extends ViewModel {
// private MutableLiveData<Integer> foo; <-- obsolete with state saving
private SavedStateHandle mState;
private static final String FOO_KEY = "foo";
// Do I need this anymore? How do I combine this with the other constructor?
public myViewModel() {
foo = new MutableLiveData<>();
foo.setValue(4);
}
// Constructor for the savedStateHandle
public myViewModel(SavedStateHandle savedStateHandle) { mState = savedStateHandle; }
LiveData<Integer> getFoo() { return mState.getLiveData(FOO_KEY); }
void setFoo(int foo) { mState.set(FOO_KEY, foo); }
}
显然,如果我取出旧的构造函数和MutableLiveData 成员,那么当我访问片段中的 ViewModel 时,数据将为空(因为我还没有告诉活动显式保存状态),并且我还没有实例化任何数据。
【问题讨论】:
标签: java android savestate android-savedstate viewmodel-savedstate