Nap*_*ake 13 android android-jetpack-compose
是否可以从 ViewModel 观察 MutabeState 的变化?显然,对 MutableState 所做的所有更改都会导致 Composable 中的重新组合。但是是否可以从 ViewModel 观察可组合项对 MutableState 所做的更改?
例如:假设我们有来自用户的输入文本,该值存储在 ViewModel 的 MutableState 中。当用户输入 6 个字符时,我们希望在 ViewModel 中触发一个操作。或者验证每个字符的输入。我们可以使用 MutableStateFlow 或 Channel 并在 ViewModel 的 init 中收集值来做到这一点。但只使用 MutableState 可以吗?或者实现这种行为的最佳方法是什么?
您将无法从 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 }
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5740 次 |
| 最近记录: |