在不调用 recompose 的情况下,如何更新 Jetpack 中的特定 ui 组件?
Without calling recompose, How to update a particular ui component in jetpack?
在我的 UI 中,我有一个圆形进度条,进度每秒更新一次。
UI 中的其他文本保持不变(静态)。我只想更新进度条,而不是重新组合整个屏幕。我怎样才能做到这一点?
您需要将屏幕拆分为不同的可组合项,以便在状态值发生变化时,依赖于该状态的所有视图都被分组到一个可组合项中。
以这段代码为例:
@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) {
}
如果 progress
和 text
值中的任何一个发生变化,TestScreen
将被重新组合。但是,如果 text
自上次重组以来没有更改,则 SomeTextView
将被缓存并且不会被重组。
有关重组工作原理的更多详细信息,请参阅 compose mental model。
此外,如果您明智地构建视图,不直接在代码中使用任何副作用(查看副作用 documentation for more details) and caching calculation results with remember
/view model/etc(check out state in compose documentation),那么重组将是一个非常轻松的操作。
在我的 UI 中,我有一个圆形进度条,进度每秒更新一次。 UI 中的其他文本保持不变(静态)。我只想更新进度条,而不是重新组合整个屏幕。我怎样才能做到这一点?
您需要将屏幕拆分为不同的可组合项,以便在状态值发生变化时,依赖于该状态的所有视图都被分组到一个可组合项中。
以这段代码为例:
@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) {
}
如果 progress
和 text
值中的任何一个发生变化,TestScreen
将被重新组合。但是,如果 text
自上次重组以来没有更改,则 SomeTextView
将被缓存并且不会被重组。
有关重组工作原理的更多详细信息,请参阅 compose mental model。
此外,如果您明智地构建视图,不直接在代码中使用任何副作用(查看副作用 documentation for more details) and caching calculation results with remember
/view model/etc(check out state in compose documentation),那么重组将是一个非常轻松的操作。