如何转换 ViewModel 以利用状态保存?

How to convert ViewModel to utilize state saving?

我有一个 ViewModel 我目前正在使用它来包含数据并在 Fragment 之间共享值。此模型还有助于在 activity 启动时为应用程序实例化数据。

我现在正尝试将状态保存功能添加到我的应用程序中,但我对如何将这两个系统合并在一起感到困惑。 android 文档提到使用此构造函数:

public MyViewModel(SavedStateHandle savedStateHandle) {
    mState = savedStateHandle;
}

但是,我不确定状态是如何传递的以及这个构造函数是如何在活动中使用的(这是我的用法):

 myViewModel = new ViewModelProvider(requireActivity()).get(myViewModel.class);

无论如何,由于我还需要在 savedState 为 null 的情况下实例化数据,所以我不确定该部分是如何适应的。作为参考,这里是我的 ViewModel class 的大纲:

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 时,数据将为空(因为我没有告诉 activity显式保存状态),我还没有实例化任何数据。

您不需要无参数构造函数。相反,您应该使用带有初始值的 other getLiveData() method

public class myViewModel extends ViewModel {

    private SavedStateHandle mState;
    private static final String FOO_KEY = "foo";

    public myViewModel(SavedStateHandle savedStateHandle) {
        mState = savedStateHandle;
    }

    LiveData<Integer> getFoo() {
        // Get the LiveData, setting the default value if it doesn't
        // already have a value set.
        return mState.getLiveData(FOO_KEY, 4);
    }

    void setFoo(int foo) { mState.set(FOO_KEY, foo); }

}