在撰写中获取状态栏高度的正确方法是什么?

What is the proper way to get status bar height in compose?

通常在使用 Accompanist Modifier.statusBarsHeight() 时,高度会根据状态栏的可见性而变化,如果它可见 24.dp 或更多,如果它不可见高度将为 0.dp。但我希望无论其可见性如何,高度都不会变为零。

我已经用了一段时间了:

// TODO: use better solution to get a fixed status bar height
val statusBarHeight = with (LocalDensity.current) { LocalWindowInsets.current.statusBars.top.toDp() }
val fixedStatusBarHeight = remember { statusBarHeight }

所以我最终做了一个变通方法和一个更容易使用的修饰符扩展。

首先,创建一个数据 class 来保存固定的插入值。

data class FixedInsets(
    val statusBarHeight: Dp = 0.dp,
    val navigationBarsPadding: PaddingValues = PaddingValues(),
)

其次,创建扩展和组合本地提供程序。

val LocalFixedInsets = compositionLocalOf<FixedInsets> { error("no FixedInsets provided!") }

@Composable
fun Modifier.fixedStatusBarsPadding(): Modifier {
    return this.padding(top = LocalFixedInsets.current.statusBarHeight)
}

@Composable
fun Modifier.fixedNavigationBarsPadding(): Modifier {
    return this.padding(paddingValues = LocalFixedInsets.current.navigationBarsPadding)
}

最后,在可组合函数的最根部提供固定的插入值。

val systemBarsPadding = WindowInsets.systemBars.asPaddingValues()
val fixedInsets = remember {
    FixedInsets(
        statusBarHeight = systemBarsPadding.calculateTopPadding(),
        navigationBarsPadding = PaddingValues(
            bottom = systemBarsPadding.calculateBottomPadding(),
            start = systemBarsPadding.calculateStartPadding(LayoutDirection.Ltr),
            end = systemBarsPadding.calculateEndPadding(LayoutDirection.Ltr),
        ),
    )
}

CompositionLocalProvider(
    values = arrayOf(
        LocalFixedInsets provides fixedInsets,
    ),
) {
    MainScreen()
}

导航栏填充示例:

Text(
    text = "Hello i'm a text with navigation bar padding",
    modifier = Modifier
        .fillMaxSize()
        .background(color = Color.Red)
        .fixedNavigationBarsPadding(),
)

或者您可以使用 calculateXPadding():

直接从本地组合访问 Dp 中的尺寸
val fixedInsets = LocalFixedInsets.current

Text(
    text = "The navigation bar's height is: ${fixedInsets.navigationBarsPadding.calculateBottomPadding()}",
)