如图https://stackoverflow.com/a/61166665/3286489所示,我们可以将LiveData保存在saveStateHandle中。
我可以轻松做到https://stackoverflow.com/a/61166665/3286489
private val textLiveData: MutableLiveData<String>
init {
textLiveData = savedStateHandle.getLiveData(KEY)
}
但是,当尝试如下保存时,
savedStateHandle.set(KEY, textLiveData)
我得到了错误
java.lang.IllegalArgumentException: Can't put value with type class androidx.lifecycle.SavedStateHandle$SavingStateLiveData into saved state
我在哪里弄错了?
研究完代码后,意识到我只需要保存值,就像@Parth在上面的注释中提到的一样。
savedStateHandle.set(KEY, textLiveData.value)
说明
如果我们查看set
的SavedStateHandle.java
@MainThread
public <T> void set(@NonNull String key, @Nullable T value) {
validateValue(value);
@SuppressWarnings("unchecked")
MutableLiveData<T> mutableLiveData = (MutableLiveData<T>) mLiveDatas.get(key);
if (mutableLiveData != null) {
// it will set value;
mutableLiveData.setValue(value);
} else {
mRegular.put(key, value);
}
}
这表明它将把数据放入我们存储在mutableLiveData
中的mLiveDatas
中。
为了确保liveData位于mLiveDatas
中,我们只需要在开始时使用textLiveData = savedStateHandle.getLiveData(KEY)
。检出的getLiveData
SavedStateHandle.java
@NonNull
private <T> MutableLiveData<T> getLiveDataInternal(
@NonNull String key,
boolean hasInitialValue,
@Nullable T initialValue) {
MutableLiveData<T> liveData = (MutableLiveData<T>) mLiveDatas.get(key);
if (liveData != null) {
return liveData;
}
SavingStateLiveData<T> mutableLd;
// double hashing but null is valid value
if (mRegular.containsKey(key)) {
mutableLd = new SavingStateLiveData<>(this, key, (T) mRegular.get(key));
} else if (hasInitialValue) {
mutableLd = new SavingStateLiveData<>(this, key, initialValue);
} else {
mutableLd = new SavingStateLiveData<>(this, key);
}
mLiveDatas.put(key, mutableLd);
return mutableLd;
}
如果没有,它将创建一个并在我们请求一个时放入mLiveDatas
。
显然,更好的答案是,我们甚至不需要
savedStateHandle.set(KEY, textLiveData.value)
虽然允许,但是当我们做某件事的时候
textLiveData.value = "Some data"
此已保存到状态。当从textLiveData
中检索到savedStateHandle
时,如下所示。
textLiveData = savedStateHandle.getLiveData(KEY)
因此textLiveData
已存储在savedStateHandle
中,并且无意中将对textLiveData.value
的更改保存在savedStateHandle
中。