onebone / compose-collapsing-toolbar

A simple implementation of collapsing toolbar for Jetpack Compose
MIT License
516 stars 71 forks source link

Wrong initial scroll position when toolbar has dynamic height #103

Open Veeksi opened 5 months ago

Veeksi commented 5 months ago

My toolbar is built with ConstraintLayout and it depends on WindowInsets so I can calculate statusBarHeight like this:

toolbar = {
    val paddingValues = WindowInsets.systemBars.asPaddingValues()

    Box(
        modifier = Modifier
            .padding(top = paddingValues.calculateTopPadding())
            .fillMaxWidth()
            .height(300.dp),
        contentAlignment = Alignment.BottomCenter
    ) {
        Text("Hello")
    }
}

When my toolbar container has dynamic height, the initial scrolling position is wrong because it doesn't care about dynamic statusBarHeight. You can reproduce the issue by placing those components into toolbar scope.

I am using scrollStrategy = ScrollStrategy.ExitUntilCollapsed,

You can see the actual problem in the video: https://streamable.com/i4gwqm

Veeksi commented 5 months ago

Looks like PR #101 fixes this issue

masterdev01 commented 2 months ago
    @Composable
    fun rememberStatusBarHeightDp(): Dp {
        val view = LocalView.current
        val density = LocalDensity.current

        val statusBarHeightPx = remember {
            ViewCompat.getRootWindowInsets(view)
                ?.getInsets(WindowInsetsCompat.Type.statusBars())
                ?.top ?: 0
        }

        return with(density) { statusBarHeightPx.toDp() }
    }

Use this code for top padding