首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我们如何为Android StateFlow保存和恢复状态?

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

Stack Overflow用户
提问于 2021-12-21 09:56:08
回答 3查看 747关注 0票数 3

我们可以以类似的方式创建LiveData或StateFlow,如下所示

代码语言:javascript
复制
val _liveData = MutableLiveData(0)
val _stateFlow = MutableStateFlow(0)

但是在LiveData中,我们可以通过使用

代码语言:javascript
复制
val _liveData: MutableLiveData<Int> = savedStateHandle.getLiveData("Key", 0)

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

EN

回答 3

Stack Overflow用户

发布于 2021-12-22 06:40:42

我使用ViewModel中的传统方法来存储和恢复值

代码语言:javascript
复制
    private val _stateFlow = MutableStateFlow(
        savedStateHandle.get("key") ?: InitialValue
    )

以及在设置值时

代码语言:javascript
复制
    _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/的要求用类来包装它

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2021-12-21 10:22:39

你能试试这个吗?我还没试过,但我想可能有用。

代码语言:javascript
复制
private val _stateFlow: MutableStateFlow<Int>?
    get()= savedStateHandle.get<MutableStateFlow<Int>>("KEY")
票数 0
EN

Stack Overflow用户

发布于 2022-08-07 13:00:47

我可以再提出一个解决方案。一个简单的扩展,一旦SavedStateHandle更新了MutableStateFlow,它就会被更新。

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70433526

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档