讨论广场 问答详情
#智解鸿蒙 布局报错:Flex 布局里的组件突然消失
TOMO 2025-11-21 17:06:23
118 评论 分享

下面的代码在预览器里正常,真机运行时Text('备注')直接消失了,去掉flexShrink(0)就显示,这是啥原因?

118 评论 分享
写回答
全部评论(2)
2 楼

@Entry
@Component
struct Index {
  @State message: string = 'Hello World';

  build() {
    Row(){
      Text("标题很长很长很长很长").flexShrink(1)
       Text("备注").flexShrink(0)//不允许收缩.marginLeft(10)
        .width('100%').padding(10)
    }
  }
}

大哥 我真机没问题啊。。你确定代码有问题?

2025-11-22 18:16:22
1 楼

真机宽度不够 + flexShrink(0) 把“备注”这一项变成了“不参与压缩的硬块”,导致它被整个挤到可视区域外,看起来就“消失”了
预览器更宽,不触发布局压缩,所以一切正常;真机窄,Row/Flex 开始压缩,结果布局被裁剪。

这种“前面长标题 + 后面短标记”的场景,建议让前面的标题负责收缩,尾部文案自然宽度就好,不要给尾部 flexShrink(0)

Row() {
  Text('标题很长很长很长很长')
    .layoutWeight(1)                        // 占满剩余空间
    .maxLines(1)
    .textOverflow({ overflow: TextOverflow.Ellipsis }) // 超出省略号

  Text('备注')
    .marginLeft(10)                         // 不用设置 flexShrink
}
.width('100%')
.padding(10)

要用 Flex 也可以类似写:

Flex({ direction: FlexDirection.Row }) {
  Text('标题很长很长很长很长')
    .flexGrow(1)
    .flexShrink(1)
    .maxLines(1)
    .textOverflow({ overflow: TextOverflow.Ellipsis })

  Text('备注')
    .marginLeft(10)         // 不设置 flexShrink(0),必要时加个 minWidth
}

别给尾部 Text 加 flexShrink(0),改用 layoutWeight/flexGrow 让前面的长标题去压缩,就不会真机“消失”了。

2025-11-21 19:05:17