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

Posted

技术标签:

【中文标题】我们如何保存和恢复 Android StateFlow 的状态?【英文标题】:How can we save and restore state for Android StateFlow? 【发布时间】:2022-01-22 18:16:30 【问题描述】:

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

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

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

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

对于 StateFlow,有没有办法(或 API)来保留最后一个值并恢复它,就像我们在 LiveData 中所拥有的那样?

【问题讨论】:

【参考方案1】:

我在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

【讨论】:

【参考方案2】:

你可以试试这个吗?我还没有尝试过,但我认为它可能会起作用。

private val _stateFlow: MutableStateFlow<Int>?
    get()= savedStateHandle.get<MutableStateFlow<Int>>("KEY")

【讨论】:

以上是关于我们如何保存和恢复 Android StateFlow 的状态?的主要内容,如果未能解决你的问题,请参考以下文章

Android之如何分析手机系统相册图片和视频删除后保存的位置然后恢复文件,目前已经适配小米OPPOVIVO一加努比亚魅族等手机。

保存/恢复android webview的状态

Android11.2 通过重写对应的方法保存和恢复实例的状态

如何保存android通知并在重启时恢复它们

如何在 Android Lollipop 中保存 WebView 状态并恢复它?

如何在 Android Lollipop 中保存 WebView 状态并恢复它?