Android compose修饰符宽度在可滚动/惰性行中出现意外行为

cgfeq70w  于 2023-01-24  发布在  Android
关注(0)|答案(1)|浏览(157)

我正在构建一个基本的布局,它显示一个带有卡片的水平滚动行。卡片是一个列组件,中间有几个分隔符:

@Composable
fun TestCard(
  name: String
) {
  Column(
    modifier = Modifier
      .background(MaterialTheme.colors.surface)
      .padding(12.dp),
    horizontalAlignment = Alignment.Start
  ) {
    Text(text = name, style = Typography.h4.bold.black)
    Spacer(modifier = Modifier.height(8.dp))
    Divider(color = Color.Black) //DOES NOT APPEAR IN ROW
    Spacer(modifier = Modifier.height(8.dp))
    Divider(modifier = Modifier.fillMaxWidth(), color = Color.Black) //DOES NOT APPEAR IN ROW
    Spacer(modifier = Modifier.height(8.dp))
    Text(text = "Other text", style = Typography.h4.bold.black)
  }
}

我还有一个可滚动行,其中包含这些卡片的列表:

@Composable
fun TestComponent() {

  val scrollState = rememberScrollState()
  val names = listOf("Martha", "Erik","Steve","Roy","Pete")

  Column(
    modifier = Modifier
      .fillMaxWidth()
      .background(MaterialTheme.colors.primary),
    horizontalAlignment = Alignment.Start
  ) {
    Row(Modifier.horizontalScroll(scrollState), horizontalArrangement = Arrangement.spacedBy(16.dp)) {
      names.forEach { name ->
        TestCard(name)
      }
    }
  }
}

当我单独显示卡片时,我可以看到两个分隔线。当我显示包含卡片的行时,分隔线不显示,因为它们的宽度设置为0(我可以使用LayoutInspector验证分隔线是否存在)。视觉表示:

我知道我可以为宽度创建一个状态变量,它将在Modifier.onSizeChanged中更新,但我确信发生这种情况一定有原因,也一定有更好的解决方案。

von4xj4u

von4xj4u1#

Divider有一个fillMaxWidth()修饰符,但是当你检查文档时:
如果传入的最大宽度为Constraints.Infinity,则此修改器无效。
这是因为horizontalScroll
必须指定DividerSpacer的宽度。
解决方法是将width(IntrinsicSize.Max)应用于TestCard中的Column。这样,约束条件具有Constraints.fixedWidth(width)

@Composable
fun TestCard(
    name: String
) {
    Column(
        modifier = Modifier
            .width(IntrinsicSize.Max)
            .background(androidx.compose.material.MaterialTheme.colors.surface)
            .padding(12.dp),
        horizontalAlignment = Alignment.Start
    ) {
        Text(text = name,)
        Spacer(modifier = Modifier.height(8.dp).fillMaxWidth())
        Divider(color = Color.Black, modifier = Modifier.fillMaxWidth()) 
        Spacer(modifier = Modifier.height(8.dp).fillMaxWidth())
        Divider(modifier = Modifier.fillMaxWidth(), color = Color.Black) 
        Spacer(modifier = Modifier.height(8.dp).fillMaxWidth())
        Text(text = "Other text" )
    }

}

相关问题