底部导航栏与 Jetpack Compose 中的屏幕内容重叠

Bottom Nav Bar overlaps screen content in Jetpack Compose

我有一个 BottomNavBarScaffoldbottomBar 中调用。
每个屏幕都包含一个显示一堆图像的 LazyColumn
出于某种原因,当我完成滚动时,BottomNavBar 与项目列表的下部重叠。
我该如何解决这个问题?

这里是MainActivity的设置内容

SetContent{
    Scaffold(
        topBar = {
            TopAppBar(
                title = { Text(text = "tartufozon") },
                actions = {
                    IconButton(onClick = { Timber.d("Mail clicked") }) {
                        Icon(Icons.Default.Email, contentDescription = null)
                    }
                }
            )
        },
        bottomBar = {
            BottomNavBar(navController = navController)
        }
    ) {
    BottomNavScreensController(navController = navController)
    }
}

根据 API definition for Scaffold, your inner content (the trailing lambda you have your BottomNavScreensController in), is given a PaddingValues 对象,为您的顶部应用栏、底部栏等提供适当的填充量

现在,您根本没有引用该填充,因此,您的内容没有填充。这就是导致重叠的原因。

您可以在 BottomNavScreensController 周围添加一个 Box 以应用填充,或者将填充直接传递到您的 BottomNavScreensController 以便每个单独的屏幕都可以正确应用填充;两种解决方案都有效。

Scaffold(
    topBar = {
      //
    },
    bottomBar = {
        //
    }
    ) { innerPadding ->
        // Apply the padding globally to the whole BottomNavScreensController
        Box(modifier = Modifier.padding(innerPadding)) {
            BottomNavScreensController(navController = navController)
        }
    }
}

遵循 ianhanniballake 的回答及其评论,只是为了节省您几分钟的时间。代码类似于:

Scaffold(
    topBar = {
      //
    },
    bottomBar = {
        //
    }
    ) { innerPadding ->
        Box(modifier = Modifier.padding(
          PaddingValues(0.dp, 0.dp, 0.dp, innerPadding.calculateBottomPadding()) {
            BottomNavScreensController(navController = navController)
        }
    }
}

您不再需要进行任何计算。在脚手架内容中,执行:

content = { padding ->
  Column(
    modifier = Modifier.padding(padding)
  ) {...
Scaffold(
    bottomBar = {
       BottomNavigationBar(navController = navController)
   }
) { innerPadding ->
      Box(modifier = Modifier.padding(innerPadding)) {
               DestinationsNavHost(
                  navGraph = NavGraphs.root,
                  navController = navController,
                  engine = navHostEngine
                )
         }
}