我想使用视图模型中的布尔变量来触发活动类中的可组合项。只要变量发生变化,它就应该重新组合。
class TestViewModel: ViewModel() {
var isVisible = true
}
@Composable
fun TestScreen(viewModel: TestViewModel) {
val showComposable by remember { mutableStateOf(viewModel.isVisible) }
if (showComposable) {
// my composables
}
}
@Composable
fun SomeAction(viewModel: TestViewModel) {
viewModel.isVisible = false
}
但是,通过这样做,它不会触发/重组并始终显示可组合项。 我需要改变什么?
showComposable
与视图模型的 isVisible
没有连接。它只是用它的值初始化,但仅此而已。没有可靠的方法来观察视图模型属性的变化。您可以将 MutableState 本身移至视图模型,但这有几个缺点。最好的解决方案是将视图模型的状态公开为 StateFlow:
class TestViewModel : ViewModel() {
private val _isVisible = MutableStateFlow(true)
val isVisible = _isVisible.asStateFlow()
fun setVisible(isVisible: Boolean) {
_isVisible.value = isVisible
}
}
现在您可以在可组合项中观察
isVisible
的变化。函数
collectAsStateWithLifecycle
会为您处理所有这些事情。您需要将工件 androidx.lifecycle:lifecycle-runtime-compose
添加到您的 gradle 文件中,以便您可以使用该功能。您的可组合项将如下所示:@Composable
fun TestScreen(viewModel: TestViewModel) {
val showComposable by viewModel.isVisible.collectAsStateWithLifecycle()
if (showComposable) {
// my composables
}
}
@Composable
fun SomeAction(viewModel: TestViewModel) {
viewModel.setVisible(false)
}
每当调用
setVisible
时,流的值都会更改,并且
showComposable
的状态也会更新。这会触发重组,并且依赖于 showComposable
值的所有内容也会更新。