android 在Jetpack Compose中触发不必要的重组

ltqd579y  于 2023-03-27  发布在  Android
关注(0)|答案(1)|浏览(165)

我有以下Android Jetpack Compose组件:

@Composable
fun TestScreen(){

    println("inside-TestScreen()")
    
    var number by remember{ mutableStateOf(1) }

    Button(onClick = { number++ }) {

        println("inside-Button()")
        
        Column {

            println("inside-Column()")
            
            Text("Hello $number")

        }

    }

}

在编写时,将记录以下内容:

inside-TestScreen()
inside-Button()
inside-Column()

但是,当我点击按钮(即更改状态变量number)时,会发生重组,并记录以下内容:

inside-Button()
inside-Column()

显然,Button内容被重新组合了,我不明白为什么。Button内容没有使用number变量,所以我认为Jetpack Compose会足够聪明,知道Button内容不需要重新组合。我以为只有Column内容会重新组合,并且只有inside-Column()会被记录。
为什么Button的内容会重新组合,即使它对已更改的状态没有依赖性?

kb5ga3dv

kb5ga3dv1#

因为ColumnBoxRow和任何内联并返回Unit的Composable都不会创建scope。当重组发生时,Jetpack Compose会检查出最接近的重组范围,即您示例中Button的内容。
您可以参考这些答案,了解更多细节和第一个链接中的文章。
Jetpack Compose Smart Recomposition
Why does mutableStateOf without remember work sometimes?

相关问题