如何使用视图模型触发可变状态?

问题描述 投票:0回答:1

我想使用视图模型中的布尔变量来触发活动类中的可组合项。只要变量发生变化,它就应该重新组合。

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
}

但是,通过这样做,它不会触发/重组并始终显示可组合项。 我需要改变什么?

android kotlin android-jetpack-compose viewmodel mutablestateof
1个回答
0
投票

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
值的所有内容也会更新。
    

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.