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

3
我们可以通过以下类似方式创建LiveData或StateFlow。
val _liveData = MutableLiveData(0)
val _stateFlow = MutableStateFlow(0)

然而在LiveData中,我们可以通过使用

来确保数据的保存和恢复
val _liveData: MutableLiveData<Int> = savedStateHandle.getLiveData("Key", 0)

对于 StateFlow,是否有一种(或 API)保持上一个值并恢复它的方法,就像 LiveData 中的那样?
3个回答

3

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

0
我可以提出另一种解决方案。一个简单的扩展,将在 MutableStateFlow 更新后更新 SavedStateHandle
fun <T> SavedStateHandle.getMutableStateFlow(
    scope: CoroutineScope,
    key: String,
    initialValue: T
): MutableStateFlow<T> {
    return MutableStateFlow(get(key) ?: initialValue).apply {
        scope.launch(Dispatchers.Main.immediate) {
            this@apply.collect { value ->
                set(key, value)
            }
        }
    }
}

0

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接