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
    占位。
相关推荐
zh_xuan3 天前
Android compose Navigation 页面导航
android·compose
stevenzqzq6 天前
Kotlin 进阶指南:中缀函数 (Infix Function)
android·kotlin·compose
zh_xuan10 天前
Android compose 自定义主题
android·compose
zh_xuan10 天前
Android compose 使用viewModel
android·compose
stevenzqzq11 天前
MVI架构3--实战示例:我的收藏页面
设计规范·compose·mvi架构
zh_xuan11 天前
Android compose测试数据双向绑定
android·compose
stevenzqzq14 天前
Compose 调用层参数设计规范(基于默认值复用原则)
设计规范·compose
stevenzqzq14 天前
Compose 三层结构设计规范1(基于Slot API)
设计规范·compose
Jomurphys20 天前
Compose 自定义 - 处理交互 Interaction
android·compose
ClassOps20 天前
记录 Android WebView内核更新,安全区 和 Insets 消费问题
android·webview·compose