1

我们可以通过以下类似的方式创建 LiveData 或 StateFlow

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

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

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

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

4

2 回答 2

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
}
于 2021-12-22T06:40:42.310 回答
0

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

private val _stateFlow: MutableStateFlow<Int>?
    get()= savedStateHandle.get<MutableStateFlow<Int>>("KEY")
于 2021-12-21T10:22:39.253 回答