1

这是我的问题;

  • 当我在屏幕中添加可组合的 MyText 时,我会看到所有日志(value1、value2、value3),这意味着它正在重新组合我的代码的每个部分。
  • 但是,当我评论 MyText 行时,我在 Logcat 上只看到 value3

我怎样才能解决这个问题 ?我知道这不是一个大问题,但想象一下我们这里有一个可滚动的 Column 并且我们正在尝试将 ScrollState.value 传递给 My Text 组件。由于这种情况,我们的列表变得如此滞后。

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())
}

编辑 存在主要问题,可滚动列;

@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())
}
4

1 回答 1

0

这种行为是完全可以预料的。

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.
    }
}
于 2022-02-22T04:19:35.250 回答