如何将LiveData保存到saveStateHandle?

问题描述 投票:0回答:2

如图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

我在哪里弄错了?

android android-livedata android-architecture-components android-savedstate
2个回答
0
投票

研究完代码后,意识到我只需要保存值,就像@Parth在上面的注释中提到的一样。

savedStateHandle.set(KEY, textLiveData.value)

说明

如果我们查看setSavedStateHandle.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)。检出的getLiveDataSavedStateHandle.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


0
投票

显然,更好的答案是,我们甚至不需要

savedStateHandle.set(KEY, textLiveData.value)

虽然允许,但是当我们做某件事的时候

textLiveData.value = "Some data"

此已保存到状态。当从textLiveData中检索到savedStateHandle时,如下所示。

textLiveData = savedStateHandle.getLiveData(KEY) 

因此textLiveData已存储在savedStateHandle中,并且无意中将对textLiveData.value的更改保存在savedStateHandle中。

© www.soinside.com 2019 - 2024. All rights reserved.