在 Jetpack Compose 中的脚手架底部栏上显示键盘并应用适当的插入填充

Show keyboard over Scaffold's bottomBar in Jetpack Compose and apply proper inset paddings

我在主屏幕上使用 Scaffold,固定的 bottomBar 在应用程序的每个屏幕上都可见,我正在应用 innerPadding Scaffold 到它的内容。

我希望键盘显示在 bottomBar 上方,为此我只将 imePadding() 应用于 Scaffold 的内容。

但是,当键盘打开时,ScaffoldinnerPadingimePadding() 都应用于内容填充。

我试过Accompanist Insets migration,但运气不好。

有没有什么办法可以防止它并只应用一个或另一个?

这是我的一段代码:

Scaffold(
    topBar = { },
    bottomBar = { },
    modifier = Modifier
        .systemBarsPadding()
) { innerPadding ->
    Content(
        modifier = Modifier
            .padding(innerPadding)
            .imePadding()
    )
}

这是结果:

对于现在已弃用的伴奏插图,我使用了以下解决方案:

val isImeVisible = LocalWindowInsets.current.ime.isVisible
val contentPadding = remember(isImeVisible) {
    if (isImeVisible) PaddingValues(top = innerPadding.calculateTopPadding()) else innerPadding
}

根据 Accompanist Insets migrationLocalWindowInsets.current.ime 应替换为 WindowInsets.ime

暂时没有 isVisible,直到 bug 修复。这是我现在 re-created 的方式:

val WindowInsets.Companion.isImeVisible: Boolean
    @Composable
    get() {
        val density = LocalDensity.current
        val ime = this.ime
        return remember {
            derivedStateOf {
                ime.getBottom(density) > 0
            }
        }.value
    }

用法:

val isImeVisible = WindowInsets.isImeVisible

这应该适用于您的旧 remember(isImeVisible) 代码。