HarmonyOS 鸿蒙Next中关于List组件的height属性问题

HarmonyOS 鸿蒙Next中关于List组件的height属性问题 DevEco Studio 版本:下载中心最新版6.0.0

出现的问题:当List未设置高度时,警告提示:You are advised to initialize the width and height attributes of the List component. 但是,你们的组件应该设置了默认高度为自适应啊,出现这个提示是否合理?

3 回复

【解决方案】

开发者您好,这个其实是个警告不影响的实际的使用的,如果您没有初始化高度List组件会自适应高度但是这会导致在某些情况下显示不全,您可以设置一下layoutWeight属性(需要父组件设置固定高度)这样List组件就可以和兄弟组件按权重分配父组件尺寸。

也可以参考一下下面List根据其中ListItem的高度进行高度的自适应的案例: 1、通过给ListItem添加onAreaChange事件,通过回调获取每个ListItem组件的高度,通过对比将最大值赋值给List组件的height属性,使用示例如下:

@Entry
@Component
struct listDemoFirst {
  private arr: string[] = ['这是一段文本', '这是一段文本这是一段文本',
    '这是一段文本这是一段文本这是一段文本这是一段文本这是一段文本这是一段文本这是一段文本这是一段文本这是一段文本这是一段文本',
    '3', '4',
    '这是一段文本这是一段文本', '这是一段文本', '这是一段文本', '这是一段文本', '这是一段文本这是一段文本这是一段文本'];
  @State sizeValue: number = 0;

  build() {
    Row() {
      List() {
        ForEach(this.arr, (item: string) => {
          ListItem() {
            Text(item)
              .width('40%')
              .height('auto')
              .fontSize(16)
              .border({ width: 1 })
              .textAlign(TextAlign.Center)
              .borderRadius(10)
              .backgroundColor(0xFFFFFF)
              .onAreaChange((oldValue: Area, newValue: Area) => {
                if (Number(newValue.height) > Number(this.sizeValue)) {
                  this.sizeValue = Number(newValue.height)
                }
              })
          }
        }, (item: string) => item)
      }
      // 排列方向
      .scrollBar(BarState.Auto)
      .backgroundColor(Color.Gray)
      .width('100%')
      .height(this.sizeValue)
    }.width('100%').padding({ top: 5 })
  }
}

2、在父容器高度受限的场景下,可通过List组件的constraintSize属性设置maxHeight参数控制最大高度,实现动态伸缩布局。示例代码如下:

@Entry
@Component
struct Index {
  @State itemHeight: number = 200;

  build() {
    Column() {
      Column() {
        Text('内容1')
        Button('改变ListItem2高度').onClick(() => {
          this.itemHeight = this.itemHeight === 200 ? 900 : 200;
        })
      }
      .width('100%').height(100).backgroundColor('#F1F3F5')

      List() {
        ListItem() {
          Text('ListItem1')
        }

        ListItem() {
          Text('ListItem2')
        }
        .height(this.itemHeight)
      }
      .divider({ strokeWidth: 1, color: '#000' })
      .constraintSize({ maxHeight: 'calc(100% - 200vp)' })

      Column() {
        Text('内容2')
      }
      .width('100%').height(100).backgroundColor('#F1F3F5')
    }
    .width('100%')
    .height('100%')
  }
}

【背景知识】

  • List是用于展示动态数据集合的核心组件,支持滚动、动态更新等特性。
  • onAreaChange事件在组件区域变化时触发该回调。仅会响应由布局变化所导致的组件大小、位置发生变化时的回调。可以使用该组件获取组件的高度。
  • constraintSize设置约束尺寸,组件布局时,进行尺寸范围限制。

更多关于HarmonyOS 鸿蒙Next中关于List组件的height属性问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next中,List组件的height属性用于设置列表的固定高度。若未设置或设置为百分比,List默认会占满父容器。在自适应场景下,建议使用Flex布局或设置List的layoutWeight属性来动态调整高度,而非硬编码height值,以确保在不同屏幕尺寸下的正确显示。

在HarmonyOS Next中,List组件默认确实采用自适应高度布局。当您未显式设置height属性时,系统会根据其子项的总高度自动计算并撑开List。

您遇到的警告信息“You are advised to initialize the width and height attributes of the List component.”是一个开发阶段的提示性建议,而非错误。其设计初衷是:

  1. 性能优化:在开发复杂列表或需要精确控制滚动区域时,为List预设一个明确的高度(或通过Flex布局等约束其高度)有助于渲染引擎更早地进行布局计算,可能带来更流畅的滚动体验。
  2. 布局确定性:在某些嵌套布局或动态内容场景下,明确的高度约束可以避免因内容测量顺序导致的细微布局抖动,使布局行为更可预测。
  3. 最佳实践引导:该提示鼓励开发者明确组件的尺寸意图,这被认为是构建稳健UI的一种良好习惯。

结论:该警告的出现是合理的,它是一个可忽略的优化建议。如果您的List在预览和运行时的显示效果都符合预期(即正确自适应),您可以完全放心地继续开发,无需为此警告添加height属性。只有当您遇到具体的布局问题或确有性能优化需求时,才需要考虑为其设置明确的高度或通过父容器约束其尺寸。

回到顶部