在不调用recompose的情况下,如何更新jetpack中的特定ui组件?

Sof*_*Guy 4 android android-jetpack android-jetpack-compose

在我的用户界面中,我有一个圆形进度条,进度每秒更新一次。该 UI 中的其他文本保持(静态)。我只想更新进度条,而不是重新组合整个屏幕。我怎样才能实现这个目标?

Phi*_*hov 5

您需要将屏幕拆分为不同的可组合项,以便当状态值更改时,依赖于该状态的所有视图都将分组为单个可组合项。

看一下这段代码的例子:

@Composable
fun TestScreen(
) {
    var progress by remember { mutableStateOf(0f) }
    var otherStateValue by remember { mutableStateOf("") }
    Box {
        SomeTextView(otherStateValue)
        ProgressView(progress)
    }
}


@Composable
fun SomeTextView(text: String) {
    
}

@Composable
fun ProgressView(progress: Float) {

}
Run Code Online (Sandbox Code Playgroud)

TestScreen如果progress和值中的任何一个发生变化,将会重新组合text。但如果自text上次重组以来没有更改,SomeTextView则会被缓存并且不会被重组。

有关重组工作原理的更多详细信息,请参阅撰写心理模型。

另外,如果您明智地构建视图,而不直接在代码中使用任何副作用(查看副作用文档以了解更多详细信息)并使用 /view model/etc 缓存计算结果remember(查看撰写文档中的状态),然后重新组合将是一个非常轻松的操作。