Android可变状态观察ViewModel中的变化

13

在ViewModel中观察MutableState的更改是否可能?显然,对MutableState所做的任何更改都会导致重新组合Composable。但是,是否可能从ViewModel观察组件对MutableState所做的更改?

例如:假设我们有来自用户的输入文本,该值存储在ViewModel中的MutableState中。当用户输入6个字符时,我们希望在ViewModel中触发一个动作。或者验证每个字符的输入。我们可以使用MutableStateFlow或Channel并在ViewModel的init中收集值来完成此操作。但是,是否只使用MutableState也可以实现这种行为?或者,最好的方法是什么?


4
这回答解决了你的问题吗?Jetpack Compose中如何观察ViewModel中的mutableStateOf? - undefined
1个回答

0
你无法从ViewModel中观察到MutableState,因为它来自于androidx.compose.runtime.mutableStateOf包,并且不是为此设计的。 积极的一点是,与Compose一起使用非常简单,只需在字段中编写即可更新UI的必要部分。没有postValue()或.observe()函数。
解决问题的另一种方法是使用StateFlow,它来自于kotlinx.coroutines.flow.Flow包。
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.onEach

// ViewModel
private val _testState = MutableStateFlow<Int>(2)
val testState: StateFlow<Int> get() = _testState.asStateFlow()

init {
    testState.onEach {
        if (it == 5) {
            // caught
        }
    }
}

fun someFunc() {
    _testState.update { 5 }
}

你可以在这个仓库中找到灵感: https://github.com/android/nowinandroid/blob/main/feature/foryou/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel.kt#L86

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