Har*_*nch 2 android android-studio android-jetpack-compose android-jetpack-compose-list compose-recomposition
这是我的问题;
我怎样才能解决这个问题 ?我知道这不是一个大问题,但想象一下我们这里有一个可滚动的列,并且我们正在尝试将 ScrollState.value 传递给我的文本组件。由于这种情况,我们的列表变得如此滞后。
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
Screen()
}
}
}
@Composable
fun Screen(){
var counter by remember {
mutableStateOf(0)
}
Log.i("RECOMPOSE","VALUE1")
Column() {
Text(text = "Just a text")
Log.i("RECOMPOSE","VALUE2")
Button(onClick = { counter = counter.plus(1) }) {
Text(text = counter.toString())
Log.i("RECOMPOSE","VALUE3")
}
MyText(counter)
}
}
@Composable
fun MyText(counter:Int){
Text(text = counter.toString())
}
Run Code Online (Sandbox Code Playgroud)
编辑 滚动列存在主要问题;
@Composable
fun Screen(){
val scrollState = rememberScrollState()
Box() {
Column(modifier = Modifier
.verticalScroll(scrollState)
.padding(top = 50.dp)) {
//Some Static Column Elements with images etc.
}
MyText(scrollStateValue = scrollState.value) //Doing some UI staff in this component
}
}
@Composable
fun MyText(scrollStateValue:Int){
Text(text = scrollStateValue.toString())
}
Run Code Online (Sandbox Code Playgroud)
这种行为完全是预料之中的。
Compose 正在尝试尽可能地减少重组次数。当您注释掉 时MyText,唯一依赖的视图counter是Button内容,因此这是唯一需要重构的视图。
按照相同的逻辑,您不应该VALUE1多次看到日志,但这里的区别在于Column功能inline,因此如果需要重新组合内容 - 它会与包含视图一起重新组合。
利用这些知识,您可以轻松地防止视图被重组:您需要将不依赖于状态的部分移动到单独的可组合项中。它使用的事实scrollState不会使其重组,只有读取状态值才会触发重组。
@Composable
fun Screen(){
val scrollState = rememberScrollState()
Box() {
YourColumn(scrollState)
MyText(scrollStateValue = scrollState.value) //Doing some UI staff in this component
}
}
@Composable
fun YourColumn(scrollState: ScrollState){
Column(modifier = Modifier
.verticalScroll(scrollState)
.padding(top = 50.dp)) {
//Some Static Column Elements with images etc.
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4086 次 |
| 最近记录: |