内容填充参数未被使用。

101
我最近开始使用Jetpack Compose进行工作。我有以下的可组合部件:
@Composable
fun SearchScreen(navController: NavHostController) {
    Scaffold(
        topBar = { SearchBar() },
        content = {
            Column (
                modifier = Modifier.fillMaxSize()
            ) {
                // some nested Composables
            }
        }
    )
}
但是,使用这段代码时,content = {...} 中的整个代码都被用红色下划线标出,显示Jetpack Compose: Content padding parameter it is not used。我已经在this Stackoverflow帖子中读到,实际上,只有在设置了bottomBar的情况下,才会在Scaffold中提供PaddingValues,而在这里显然不是这种情况。所以我不明白为什么会出现这个错误。 注意:实际上,该应用程序确实使用了BottomNavigation,但不是在上面显示的Composable中。这可能是因为这个原因在这里仍然传播吗?

2
我复制粘贴了你的可组合代码,但无法重现下划线错误。我还将content参数作为尾随lambda放置,代码可以正常工作。 - Tonnie
有趣。这和我的 Compose 版本有关系吗?我使用的是 compose_version = '1.2.0-alpha08',因为我需要 FilterChip Composable。你用的是哪个版本? - BenjyTec
1
是的,我正在使用 composeVersion = "1.1.1",并且我已经看到了下面 @Pylyp Dukhov 的回答,这澄清了其中的差异。 - Tonnie
7个回答

213
需要使用padding参数,传递给Scaffold content组件。您应该将其应用于content中的最顶层容器/视图:
content = { padding ->
    Column(
        modifier = Modifier
            .padding(padding)
    // ...
这样做是为了防止布局问题,例如当脚手架有底部栏时,如果不使用这个填充部分,你的视图的一部分将位于栏下面。 你可以始终使用@SuppressLint("UnusedMaterialScaffoldPaddingParameter")来禁止它,但我建议只在你确切知道自己在做什么时才这样做。

1
谢谢,这解释得很清楚!但我还有一个跟进问题,如果我将NavHost设置为Scaffold的子项,我应该直接对NavHost设置填充,还是需要以某种方式将这个填充值传递到将在NavHost内显示的不同组合中? - BenjyTec
2
@BenjyTec 你应该将它应用到最顶层的容器,即 NavHost - Phil Dukhov
我已经将此应用于我的最顶层容器,但仍然出现错误,抑制似乎是摆脱它的唯一方法。 - alfietap
2
@alfietap,我这边没有显示错误。请确保您正在使用最新的IDE和Android Gradle插件。尝试创建一个具有相同代码的新项目,以查看是否可以重现该问题。如果是,请报告,并包括此示例项目、您的IDE版本和示例项目。 - Phil Dukhov
天啊,我当时就像是怎么回事;我从另一个正在进行的项目中复制了一个可组合项,它在那里很好用,但我没有看到它在我的新项目中出了问题。我猜我的旧项目可能使用的是稍旧版本的Compose。唉,谢谢啦。 - clamum
显示剩余2条评论

11

我在alpha版本中发现了一个bug,当我使用SmallTopAppBar()时,Scaffold没有为两个组合提供填充,因此它们重叠在一起。 更新后,我意识到该bug已经修复,并且Scaffold自己有一个填充,因此组合不再重叠在一起。

用法:

  Scaffold(topBar = { AppBar() }) { paddingValues ->
  AnyComposable(modifier = Modifier.padding(paddingValues)){

  }

8
添加 it 关键字:
Scaffold(
        topBar = { SearchBar() },
        content = { it
            Column(modifier = Modifier
                .fillMaxSize()
                .verticalScroll(rememberScrollState()))

这应该可以工作。


野生,它有效。但你能详细解释一下吗? - Jugert Mucoimaj
@JugertMucoimaj 你的问题已经由Phil Dukhov在下面回答了。https://dev59.com/vVEG5IYBdhLWcg3wJ1Ny#72085218 - sgurdag
根据我的理解,这样做可以消除代码中的linting错误,因为在使用it关键字的内容组合函数中,已经“使用”了padding参数。然而,这并没有真正应用padding,所以这只是一个权宜之计,而不是一个解决方法。请参考被接受的答案,以找到一个有效的解决方法。 - undefined

3
您可以使用这个注释:
@SuppressLint("UnusedMaterialScaffoldPaddingParameter")

1
我通过将内容的填充传递给Modifier padding方法来解决了这个问题: 示例:
 content = { padding ->
                MainScreenContainer(
                    navController = navController,
                    modifier = Modifier.padding(padding)
                )
            }

1
使用padding在Column中,并删除content
Scaffold(
    topBar = { SearchBar() }
){
    Column(Modifier.padding(it)) {
                ...
    }
}

-5

在 app build.gradle 中添加:

 buildFeatures {
    compose = true
    kotlinOptions.freeCompilerArgs += "-Xopt-in=androidx.compose.material.ExperimentalMaterialApi"
    kotlinOptions.freeCompilerArgs += "-Xopt-in=androidx.compose.foundation.ExperimentalFoundationApi"
    kotlinOptions.freeCompilerArgs += "-Xopt-in=androidx.compose.ui.ExperimentalComposeUiApi"
    kotlinOptions.freeCompilerArgs += "-Xopt-in=androidx.compose.animation.ExperimentalAnimationApi"
    kotlinOptions.freeCompilerArgs += "-Xopt-in=androidx.compose.animation.graphics.ExperimentalAnimationGraphicsApi"
    kotlinOptions.freeCompilerArgs += "-Xopt-in=kotlinx.serialization.ExperimentalSerializationApi"
    kotlinOptions.freeCompilerArgs += "-Xopt-in=com.google.accompanist.navigation.material.ExperimentalMaterialNavigationApi"
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,