HarmonyOS 鸿蒙Next 怎么解决自定义Span组件在NavDestination下无法显示问题

发布于 1周前 作者 yuanlaile 最后一次编辑是 5天前 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 怎么解决自定义Span组件在NavDestination下无法显示问题

【问题现象】

包含Span组件的自定义组件,包含在Text组件下,使得该Text组件置于NavDestination页面下,结果该自定义组件Span里的内容:Span自定义组件内容,没有显示。如下图:

点击放大

【背景知识】

  • Text组件:Text是文本组件,通常用于展示用户视图,如显示文章的文字。
  • NavDestination组件:设置系统状态栏的样式组件。

【定位思路】

  • Page会把全部的自定义组件都展开,Text组件解析到了自定义组件下。
  • NavDestination机制不会全部展开自定义组件依赖后续组件内部自行展开,Text组件非容器组件,没有在解析子组件时做展开自定义操作。

【解决方案】

(1)Text不支持自定义组件,且Span组件作为Text、ContainerSpan组件的子组件,只能在这两个组件内使用,把Text和其下的Span抽离出来成单独的组件。

代码示例如下:

@Component
export struct pageOne{
  build() {
    NavDestination(){
      Column(){
        Text() {
          Span('Text直接包含的Span子组件1\n')
          Span('Text直接包含的Span子组件2\n')
          Span('Span自定义组件内容')
        }
      }.height('100%')
      .justifyContent(FlexAlign.Center)
    }
  }
}

@Entry
@Component
struct Index {
  pageInfos: NavPathStack = new NavPathStack()

  aboutToAppear(): void {
    console.info('nav index')
  }

  [@Builder](/user/Builder)
  pages() {
    pageOne()
  }

  build() {
    Navigation(this.pageInfos){
      Column(){
        Button('点击跳转到NavDestination页面')
          .onClick(()=>{
            this.pageInfos.pushPath({ name: 'pageOne' })
          })
      }.height('100%')
      .justifyContent(FlexAlign.Center)

    }.navDestination(this.pages)
  }
}

最终效果:

点击放大

(2)如果Span组件是一组公共的特性,则可以通过@Builder装饰器把公共的部分抽取出来。

代码示例如下:

@Component
export struct pageOne{
  build() {
    NavDestination(){
      Column(){
        Text() {
          this.newLocalBuilder()
        }
      }.height('100%')
      .justifyContent(FlexAlign.Center)
    }
  }

  [@Builder](/user/Builder)
  newLocalBuilder() {
    Span('Text直接包含的Span子组件1\n')
    Span('Text直接包含的Span子组件2\n')
    Span('Span自定义组件内容')
  }
}

@Entry
@Component
struct Index {
  pageInfos: NavPathStack = new NavPathStack()

  aboutToAppear(): void {
    console.info('nav index')
  }

  [@Builder](/user/Builder)
  pages() {
    pageOne()
  }

  build() {
    Navigation(this.pageInfos){
      Column(){
        Button('点击跳转到NavDestination页面')
          .onClick(()=>{
            this.pageInfos.pushPath({ name: 'pageOne' })
          })
      }.height('100%')
      .justifyContent(FlexAlign.Center)

    }.navDestination(this.pages)
  }
}

最终效果:

点击放大

(3)如果需要使用自定义组件,应该选择支持自定义子组件的组件,比如Column组件。

代码示例如下:

@Component
export struct CustomSpan{

  aboutToAppear(): void {
    console.info('nav custom span')
  }
  build() {
    Text('Span自定义组件内容')
  }
}

@Component
export struct pageOne{
  build() {
    NavDestination(){
      Column(){
        Text() {
          Span('Text直接包含的Span子组件1\n')
          Span('Text直接包含的Span子组件2\n')
        }
        CustomSpan()
      }.height('100%')
      .justifyContent(FlexAlign.Center)
    }
  }
}

@Entry
@Component
struct Index {
  pageInfos: NavPathStack = new NavPathStack()

  aboutToAppear(): void {
    console.info('nav index')
  }

  [@Builder](/user/Builder)
  pages() {
    pageOne()
  }

  build() {
    Navigation(this.pageInfos){
      Column(){
        Button('点击跳转到NavDestination页面')
          .onClick(()=>{
            this.pageInfos.pushPath({ name: 'pageOne' })
          })
      }.height('100%')
      .justifyContent(FlexAlign.Center)

    }.navDestination(this.pages)
  }
}

最终效果:

点击放大

【总结】

  • 组件下的子组件在使用时,首先要判断该组件支持的子组件类型,只有支持的子组件才能使用,才能保证所有场景都正确显示,比如Span组件只能在Text、ContainerSpan组件里使用。所以,最好按照组件规格说明来使用组件。
  • 自定义组件在使用时,要判断其所在父组件是否支持自定义组件,如果不支持,则不应该包含自定义组件。比如Text组件不支持自定义组件,就不能在Text的子组件里使用自定义组件。否则,系统不能保证所有场景显示都符合预期。
  • 自定义组件在使用时,也要判断自定义组件的最外层组件的使用范围。比如,自定义组件最外层是Span,而Span只能在Text和ContainerSpan里使用,如果用在Column里,则不会生效。
1 回复

作为IT专家,针对HarmonyOS 鸿蒙Next中自定义Span组件在NavDestination下无法显示的问题,以下是一些可能的解决方案:

首先,确保Span组件是作为Text或RichEditor组件的子组件进行显示的,因为单独写Span组件不会显示信息。同时,检查Text与Span同时配置文本内容时,Span内容是否覆盖了Text内容,这可能会影响Span的显示。

其次,考虑到NavDestination组件的特殊性,它可能具有特定的布局和显示规则。因此,需要检查Span组件的样式和属性设置是否与NavDestination的布局规则冲突。例如,Span的字体大小、颜色等属性设置是否超出了NavDestination的显示范围。

此外,如果问题依旧存在,可以尝试更新至最新版本的鸿蒙系统,看是否是系统级的问题导致的显示异常。同时,检查Navigation组件的使用方式是否符合官方文档规范,避免不当使用导致的错误。

最后,如果以上方法均无法解决问题,可能是特定场景下的特殊问题。此时,建议查看开发者社区或论坛是否有类似情况的讨论和解决方案,或者联系官网客服获取更专业的帮助。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部