Hi. I’m trying to implement a collapsing toolbar b...
# compose
m
Hi. I’m trying to implement a collapsing toolbar but my code is so laggy, and it causes recomposition of screen body while scrolling screen.
Copy code
@Composable
fun Demo() {
    val scroll = rememberScrollState(0)
    Column(modifier = Modifier.fillMaxSize()) {
        CollapsingToolbar(scroll = scroll.value, title = "Screen Title")
        Body(scroll)
    }
}


@Composable
fun Body(scroll: ScrollState) {
    Column(
        modifier = Modifier
            .fillMaxSize()
            .verticalScroll(scroll)
    ) {
        repeat(5) {
            Box(
                modifier = Modifier
                    .fillMaxWidth()
                    .height(200.dp)
                    .background(Color.Red)
            )
        }
    }
}

@Composable
fun CollapsingToolbar(
    scroll: Int,
    title: String,
    onNavigateUpClicked: () -> Unit = {},
) {
    val collapseRange = with(LocalDensity.current) {
        (150.dp - 56.dp).toPx()
    }
    val collapseFraction = (scroll / collapseRange).coerceIn(0f, 1f)
    Box(
        modifier = Modifier
            .fillMaxWidth()
            .heightIn(min = 56.dp)
            .wrapContentHeight()
            .background(Color.Green),
    ) {
        IconButton(
            onClick = onNavigateUpClicked,
            modifier = Modifier
                .padding(start = 8.dp, top = 8.dp)
                .background(Color.Cyan)
                .align(Alignment.TopStart)

        ) {
            Icon(
                imageVector = Icons.Default.ArrowBack,
                contentDescription = null,
                modifier = Modifier.background(Color.Red)
            )
        }
        Text(
            text = title,
            style = MaterialTheme.typography.h6,
            modifier = Modifier
                .padding(start = 24.dp, top = 150.dp * (1 - collapseFraction))
                .align(Alignment.CenterStart)
                .offset(x = 32.dp * collapseFraction)
        )
    }
}
🧵 4
j
z
You probably want to use nested scrolling modifiers for this.