https://kotlinlang.org logo
#compose
Title
# compose
f

fengdai

09/02/2020, 4:19 AM
When Compose recomposes based on new inputs, it only calls the functions or lambdas that might have changed, and skips the rest.
Why is the root Compose function
RecompositionBehavior
always recomposed while the
Switch
only changes the input of
MaterialTheme
?
Copy code
@Preview("RecompositionBehavior")
@Composable
fun RecompositionBehavior() {
    Log.d("Recompose", "RecompositionBehavior")
    var darkTheme by remember { mutableStateOf(false) }
    MaterialTheme(
        colors = if (darkTheme) darkColors else lightColors,
    ) {
        Log.d("Recompose", "MaterialTheme")
        Surface {
            Switch(checked = darkTheme, onCheckedChange = { darkTheme = it })
        }
    }
}
s

Sebastian Kaspari

09/02/2020, 5:09 PM
the remembered
darkTheme
property is inside the
RecompositionBehavior
block, so the whole block gets recomposed afaik
f

fengdai

09/03/2020, 1:48 AM
@Sebastian Kaspari But when I move
darkTheme
from
RecompositionBehavior
to the
MaterialTheme
block,
MaterialTheme
does’t get recomposed when
darkTheme
is changed. Why?
Copy code
@Preview("RecompositionBehavior")
@Composable
fun RecompositionBehavior() {
    Log.d("Recompose", "RecompositionBehavior")
    MaterialTheme(
        colors = darkColors,
    ) {
        var darkTheme by remember { mutableStateOf(false) }
        Log.d("Recompose", "MaterialTheme")
        Surface {
            Switch(checked = darkTheme, onCheckedChange = { darkTheme = it })
        }
    }
}