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

rew*_*oes 8 windowinsets android-jetpack-compose jetpack-compose-accompanist

Scaffold在主屏幕上使用了一个bottomBar在应用程序的每个屏幕中都可见的固定屏幕,并且我将 的 应用于innerPaddingScaffold内容。

我希望键盘出现在 之上bottomBar,为此我将imePadding()only应用于Scaffold应用于的内容。

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

我尝试过伴奏插入迁移,但并不幸运。

无论如何,我可以阻止它并仅应用其中之一吗?

这是我的一段代码:

Scaffold(
    topBar = { },
    bottomBar = { },
    modifier = Modifier
        .systemBarsPadding()
) { innerPadding ->
    Content(
        modifier = Modifier
            .padding(innerPadding)
            .imePadding()
    )
}
Run Code Online (Sandbox Code Playgroud)

这是结果:

在此输入图像描述

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

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

Phi*_*hov 8

1.4.0开始你可以使用 system WindowInsets.isImeVisible. 对于 1.3.0,请参阅下面的答案:

根据伴奏插入的迁移LocalWindowInsets.current.ime应替换为WindowInsets.ime

isVisible目前还没有,直到这个错误得到修复。以下是我现在重新创建它的方法:

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

用法:

val isImeVisible = WindowInsets.isImeVisible
Run Code Online (Sandbox Code Playgroud)

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