You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在嵌套@Composable间传递参数?以Scaffold内边距传递为例

解决Jetpack Compose中Scaffold内容与TopAppBar重叠及通用组件传参问题

你遇到的核心问题是如何将Scaffold自动生成的内容安全区padding传递给内部自定义组件,同时保持封装的TestScaffold通用性。以下是具体实现方案:

关键修改点

  • 调整ParentComposable中TestScaffold的调用方式,通过lambda表达式接收padding modifier并传递给CustomColumn
  • 修正CustomColumn的Spacer使用逻辑,避免直接复用传入的modifier
  • 保留TestScaffold的高阶函数设计,这是实现通用参数传递的核心

修改后的完整代码

@Composable
fun ParentComposable() {
    Row {
        TestScaffold(
            contentComponent = { modifier ->
                // 接收Scaffold传递的padding修饰符,传递给CustomColumn
                CustomColumn(modifier = modifier)
            }
        )
    }
}

@Composable
fun CustomColumn(modifier: Modifier) {
    Column(modifier = modifier) {
        // Spacer需指定具体尺寸,不能直接复用传入的modifier
        Spacer(modifier = Modifier.height(16.dp))
        Text("Foo")
    }
}

@Preview
@Composable
fun TestScaffold(contentComponent: @Composable (modifierForContent: Modifier) -> Unit = {}) {
    Scaffold(
        topBar = {
            TopAppBar(
                title = { Text(text = "Game App", textAlign = TextAlign.Center) },
                navigationIcon = {}
            )
        },
        content = { padding ->
            // 将Scaffold的安全区padding包装成Modifier,传递给内容组件
            contentComponent(modifierForContent = Modifier.padding(padding))
        }
    )
}

原理说明

  • 高阶函数传参:TestScaffold的contentComponent被定义为接收Modifier的高阶函数,可将Scaffold内部生成的padding动态传递给任意内容组件,保证了TestScaffold的通用性。
  • 安全区适配:Scaffold的content参数提供的PaddingValues会自动计算TopAppBar、系统状态栏等占用的空间,转为Modifier应用到内容组件后,可彻底避免内容重叠问题。
  • 组件复用:后续任何页面只需调用TestScaffold,在lambda中接收modifier并传递给自身内容组件即可,无需重复编写Scaffold的导航栏逻辑。

内容的提问来源于stack exchange,提问作者Andrey Suvorov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 07:02:53