HarmonyOS 鸿蒙Next中HdsNavDestination在API18、19上一片空白

HarmonyOS 鸿蒙Next中HdsNavDestination在API18、19上一片空白

状况

API1819 使用HdsNavDestination组件的页面总是一片空白,不管是用系统路由表的Page2.ets,还是用navDestination属性的InPage,都是空白,但日志清晰打印了pathStack,说明路由上了。作为对照Page3.ets使用NavDestination组件,显示正常 API20以上就没这问题 没搞懂到底哪里出了问题?

API18 效果:

API18截图

API20 效果:

API20截图

API 18的日志:

I     [Page2] {"pathArray":[{"name":"Page2","index":0,"navDestinationId":"0"}],"isReplace":0,"type":"NavPathStack","disableAllAnimation":false,"animated":true,"nativeStack":{},"popArray":[]}
I     [Page3] {"pathArray":[{"name":"Page3","index":0,"navDestinationId":"1"}],"isReplace":0,"type":"NavPathStack","disableAllAnimation":false,"animated":true,"nativeStack":{},"popArray":[]}
I     [InPage] {"pathArray":[{"name":"InPage","index":0,"navDestinationId":"2"}],"isReplace":0,"type":"NavPathStack","disableAllAnimation":false,"animated":true,"nativeStack":{},"popArray":[]}
I     [Page2] {"pathArray":[{"name":"Page2","index":0,"navDestinationId":"3"}],"isReplace":0,"type":"NavPathStack","disableAllAnimation":false,"animated":true,"nativeStack":{},"popArray":[]}
I     [Page3] {"pathArray":[{"name":"Page3","index":0,"navDestinationId":"4"}],"isReplace":0,"type":"NavPathStack","disableAllAnimation":false,"animated":true,"nativeStack":{},"popArray":[]}
I     [InPage] {"pathArray":[{"name":"InPage","index":0,"navDestinationId":"5"}],"isReplace":0,"type":"NavPathStack","disableAllAnimation":false,"animated":true,"nativeStack":{},"popArray":[]}
I     [Page2] {"pathArray":[{"name":"Page2","index":0,"navDestinationId":"6"}],"isReplace":0,"type":"NavPathStack","disableAllAnimation":false,"animated":true,"nativeStack":{},"popArray":[]}
I     [Page3] {"pathArray":[{"name":"Page3","index":0,"navDestinationId":"7"}],"isReplace":0,"type":"NavPathStack","disableAllAnimation":false,"animated":true,"nativeStack":{},"popArray":[]}
I     [InPage] {"pathArray":[{"name":"InPage","index":0,"navDestinationId":"8"}],"isReplace":0,"type":"NavPathStack","disableAllAnimation":false,"animated":true,"nativeStack":{},"popArray":[]}

由于没有API1819的实机设备,效果都是在模拟器和云调试上测试的,都出现了空白的状况。


源码

Index.ets

import { HdsNavDestination, HdsNavigation, HdsNavigationAttribute } from '@kit.UIDesignKit';

@Entry
@Component
struct Index {
  @State message: string = 'Hello World';
  @Provide('mainNavStack') mainNavStack: NavPathStack = new NavPathStack();

  @Builder InPageBuilder(name: string, param: Object) {
    if (name === 'InPage') { InPage(); }
  }

  build() {
    HdsNavigation(this.mainNavStack){
      Column()
        .height(100)
        .width(200)
        .backgroundColor('#ffd22727')
      Button('Page2')
        .onClick(() => {
          this.mainNavStack.pushPath({
            name: 'Page2'
          })
        })
      Button('Page3')
        .onClick(() => {
          this.mainNavStack.pushPath({
            name: 'Page3'
          })
        })
      Button('InPage')
        .onClick(() => {
          this.mainNavStack.pushPath({
            name: 'InPage'
          })
        })
    }
    .navDestination(this.InPageBuilder)
  }
}

@Component struct InPage {
  @Consume('mainNavStack') mainNavStack: NavPathStack = new NavPathStack();
  build() {
    HdsNavDestination() {
      Column() {
        Text('this is InPage')
        Column()
          .height(100)
          .width(100)
          .backgroundColor('#ff00ff96')
        Text(JSON.stringify(this.mainNavStack) || '')
      }
    }
    .onReady(() => {
      console.info('[InPage]', JSON.stringify(this.mainNavStack))
    })
  }
}

Page2.ets

import { HdsNavDestination, HdsNavDestinationAttribute } from '@kit.UIDesignKit';

@Builder export function Page2Builder (){
  Page2();
}

@Component
export struct Page2 {
  mainNavStack: NavPathStack = new NavPathStack();

  build() {

    HdsNavDestination() {
      Button('is Nav')
      Column()
        .height(400)
        .width(400)
        .backgroundColor('#ff27cdff')
      Text(JSON.stringify(this.mainNavStack) || '')
    }
    .onReady((ctx: NavDestinationContext) => {
      try {
        this.mainNavStack = ctx.pathStack;
        console.info('[Page2]', JSON.stringify(ctx.pathStack))
      } catch (e) {
        console.error('[Page2]', JSON.stringify(e))
      }
    })
  }
}

Page3.ets

@Builder export function Page3Builder (){
  Page3();
}

@Component
export struct Page3 {
  mainNavStack: NavPathStack = new NavPathStack();
  build() {
    NavDestination(){
      Button('is Nav')
      Column()
        .height(400)
        .width(400)
        .backgroundColor('#ff27cdff')
      Text(JSON.stringify(this.mainNavStack) || '')
    }
    .onReady((ctx: NavDestinationContext) => {
      try {
        this.mainNavStack = ctx.pathStack;
        console.info('[Page3]', JSON.stringify(ctx.pathStack))
      } catch (e) {
        console.error('[Page3]', JSON.stringify(e))
      }
    })
  }
}

更多关于HarmonyOS 鸿蒙Next中HdsNavDestination在API18、19上一片空白的实战教程也可以访问 https://www.itying.com/category-93-b0.html

6 回复

您好,请查看此组件的最低支持API版本

相关文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ui-design-hdsnavigation

更多关于HarmonyOS 鸿蒙Next中HdsNavDestination在API18、19上一片空白的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


最低支持API版本就是API18有什么问题?要是不支持编译器早就报错了,

建议还是实机测一下

谢谢,云调试的就是实机,也是一样问题,

在HarmonyOS Next中,HdsNavDestination在API 18和19上显示空白,通常是由于API版本不兼容或组件未正确初始化导致的。请检查项目配置中使用的API版本是否与目标设备匹配,并确保HdsNavDestination的依赖项已正确添加。同时,验证布局文件中的组件声明是否正确,以及相关资源是否完整。

这是一个已知的API18、19上HdsNavDestination组件的兼容性问题。问题核心在于API20之前,HdsNavDestination组件的布局渲染机制存在缺陷,导致其内容区域无法正确显示。

从你的代码和日志分析:

  1. 路由是成功的:日志中pathStack信息正常打印,navDestinationId依次递增,证明导航栈操作和页面加载流程本身没有问题。
  2. 组件渲染失败:使用HdsNavDestinationPage2InPage页面内容为空白,而使用原生NavDestinationPage3显示正常。这直接指向了HdsNavDestination组件在低版本API上的自身问题。
  3. 版本差异:API20及以上版本正常,进一步确认这是低版本SDK中该组件的一个Bug。

根本原因:在HarmonyOS Next API18和19中,@kit.UIDesignKit中的HdsNavDestination组件在初始化或布局计算时,可能未能正确应用其内部样式或容器尺寸,导致其子组件(如你的ColumnButtonText)虽然被创建,但渲染区域高度或宽度为0,从而在视觉上表现为一片空白。这属于该UI组件在特定基础版本上的内部实现缺陷。

结论:你遇到的HdsNavDestination在API18、19上显示空白的问题,并非你的代码逻辑错误,而是SDK在API20之前存在的组件兼容性Bug。该问题在API20及后续版本中已得到修复。

回到顶部