我们如何将SavedStateHandler与LiveData Coroutine Builder结合起来



在典型的Android ViewModel中,我们可以使用轻松创建可恢复的LiveData

val liveData = savedStateHandle.getLiveData<String>("SomeKey")

无论何时设置liveData值,都会自动保存和恢复

但是,如果我们使用liveData协程生成器(即。https://developer.android.com/topic/libraries/architecture/coroutines#livedata)

val liveDataSaved: LiveData<String> = liveData {
emit(someValue)
}

我们如何也加入savedStateHandle?(例如,在恢复时,它将首先检索以前的发射值,而不是重新初始化(

注意:我可以按以下方式做,只是看起来很生气。

val liveDataSaved: LiveData<String> = liveData {
val someValue = savedStateHandle.get("Key") ?: getValue()
savedStateHandle.put("Key", someValue)
emit(someValue)
}

您可以使用MediatorLiveData组合多个其他实时数据源,然后在最后对生成的MediatorLiveData进行观察。

在您的情况下,您可以有多个MediatorLiveData来源,如下所示:

val liveDataValue = MediatorLiveData<String>().apply {
var intermediateValue = ""
fun update() {
this.value = intermediateValue
}
addSource(savedStateHandle.getLiveData<String>("SomeKey")) {
intermediateValue = it
update()
}
addSource(
liveData {
emit(someValue)
}
) {
intermediateValue = it
update()
}
}

最新更新