ConstraintLayout写法和Box写法比较

使用 ConstraintLayout 可以彻底干掉为了占位而存在的 Spacer 和嵌套的 Box,让布局层级变得非常扁平。

方案一:ConstraintLayout 写法(链式思维)

你需要先引入依赖:implementation("androidx.constraintlayout:constraintlayout-compose:1.0.1")

复制代码
ConstraintLayout(
    modifier = modifier
        .fillMaxWidth()
        .height(appDimens.dev.dp192)
        .background(Color(0xFFE6E6E6))
        .clickable(...)
        .padding(horizontal = appDimens.dev.dp64)
) {
    // 创建引用
    val (contentRef, dividerRef) = createRefs()

    // 1. 中间的内容 Row
    Row(
        modifier = Modifier
            .fillMaxWidth()
            .constrainAs(contentRef) {
                top.linkTo(parent.top)
                bottom.linkTo(parent.bottom) // 上下都连父布局,实现垂直居中
                start.linkTo(parent.start)
                end.linkTo(parent.end)
            },
        verticalAlignment = Alignment.CenterVertically
    ) {
        Column(Modifier.weight(1f)) {
            Text(text = title, ...)
            if (showSubTitle && !subTitle.isNullOrEmpty()) {
                Text(text = subTitle, ...)
            }
        }
        Icon(painter = naviIcon, ...)
    }

    // 2. 底部的分割线
    HorizontalDivider(
        modifier = Modifier
            .constrainAs(dividerRef) {
                bottom.linkTo(parent.bottom) // 约束在父布局最底部
                start.linkTo(parent.start)
                end.linkTo(parent.end)
            },
        thickness = appDimens.dev.dp2,
        color = Color(0x1A000000)
    )
}

方案二:如果不想引入新库(更轻量化的写法)

模拟链式布局

如果你不想为了一个 Item 引入 ConstraintLayout 库,其实用原生的 Box 配合 align 也是一种"模拟链式布局"的策略:

复制代码
Box(
    modifier = modifier
        .fillMaxWidth()
        .height(appDimens.dev.dp192)
        ...
) {
    // 居中的内容
    Row(
        modifier = Modifier
            .fillMaxWidth()
            .align(Alignment.Center) // 直接居中
            .padding(horizontal = appDimens.dev.dp64),
        verticalAlignment = Alignment.CenterVertically
    ) {
        // ... Column + Icon
    }

    // 置底的分割线
    HorizontalDivider(
        modifier = Modifier.align(Alignment.BottomCenter), // 直接置底
        ...
    )
}

为什么方案二往往更优?

  • 性能:在 Compose 中,Box 的渲染开销比 ConstraintLayout 小。
  • 简洁:不需要手动 createRefs()和编写复杂的 linkTo 约束。
  • 结果一致:它实现了你想要的"Row 绝对居中,Divider 绝对置底"的效果,且没有 Spacer
    占位。
相关推荐
le16161615 小时前
Android Compose——尺寸修饰符的调用顺序构成的不同尺寸约束效果
android·compose·modifier
le1616161 天前
Android Compose Modifier修饰符
android·compose·modifier
小书房1 天前
Android UI为什么由XML转向Compose
xml·ui·compose·声明式ui
le1616162 天前
Android Compose基础布局——从传统XML的视角切入了解
xml·compose
赏金术士7 天前
企业级 Jetpack Compose 项目(入门版)最佳结构
android·kotlin·compose
Jomurphys8 天前
Compose 调用 - 液态玻璃 Backdrop
android·compose
氦客11 天前
Android Compose 图层的合成 : BlendMode
android·compose·jetpack·layer·blendmode·graphics·图层的合成
赏金术士12 天前
第六章:UI组件与Material3主题
android·ui·kotlin·compose
赏金术士12 天前
Jetpack Compose 底部导航实战教程(完整版)
android·kotlin·compose
程序员煊子13 天前
用 Cursor 从零搭一个 Compose 本地记账 App:实战记录与源码解析
android·kotlin·compose·cursor