android - 我们如何保存和恢复 Android StateFlow 的状态?

标签 android android-livedata kotlin-stateflow

我们可以用类似下面的方式创建 LiveData 或 StateFlow

val _liveData = MutableLiveData(0)
val _stateFlow = MutableStateFlow(0)

但是在LiveData中,我们可以通过使用确保数据的保存和恢复

val _liveData: MutableLiveData<Int> = savedStateHandle.getLiveData("Key", 0)

对于 StateFlow,是否有一种方法(或 API)可以保留最后的值并恢复它,就像我们在 LiveData 中所做的那样?

最佳答案

我在ViewModel中使用常规方式来存储和恢复值

    private val _stateFlow = MutableStateFlow(
        savedStateHandle.get("key") ?: InitialValue
    )

以及设置值的时候

    _stateFlow.value = ChangeValue
    savedStateHandle.set("key", ChangeValue)

不理想,但至少我们有办法保存最新的值。

感谢 https://www.reddit.com/user/coffeemongrul/ ,谁提供了一个建议,根据 https://www.reddit.com/r/androiddev/comments/rlxrsr/in_stateflow_how_can_we_save_and_restore_android/ 用一个类来包装它

class MutableSaveStateFlow<T>(
    private val savedStateHandle: SavedStateHandle,
    private val key: String,
    defaultValue: T
) {
    private val _state: MutableStateFlow<T> =
        MutableStateFlow(savedStateHandle.get<T>(key) ?: defaultValue)
    
    var value: T
        get() = _state.value
        set(value) {
            _state.value = value
            savedStateHandle.set(key, value)
        }

    fun asStateFlow(): StateFlow<T> = _state
}

关于android - 我们如何保存和恢复 Android StateFlow 的状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70433526/

相关文章:

android - StateFlow 收集不会针对列表类型触发

java - 如何为 Javadoc 注释着色

android - 删除在闭包内创建的实时数据 Observer

java - 如何使 LiveData getValue() 函数返回 Android 中房间数据库中的项目列表?

android - ui中再次收集StateFlow最后一个值

android - Jetpack Compose 导航和 StateFlow 的问题

android - 重新创建一个创建的 fragment ?

c# - Xamarin – 错误修复 “The Aapt task failed unexpectedly”

java - 使用大字节数组下载大文件会导致 "Out of memory"

android - LocalBroadcastManager 已被弃用。我应该用什么代替它?