HarmonyOS鸿蒙Next应用开发中路由跳转成功但是页面是空白。父页面Navigation跳转子页面NavDestination出现空白

HarmonyOS鸿蒙Next应用开发中路由跳转成功但是页面是空白。父页面Navigation跳转子页面NavDestination出现空白

父页面:

@Entry
@Component
struct IndexPage {
  @State message: string = 'Hello World';
  pageStack : NavPathStack = new NavPathStack();

  build() {
    Navigation(this.pageStack){
      Column(){
        Text('IndexPage')
          .fontSize($r('app.float.page_text_font_size'))
        Button('跳转子页面pageOne')
          .fontSize($r('app.float.page_text_font_size'))
          .onClick(()=>{
              this.pageStack.pushPathByName("PageOne","page one")
          })
      }
      .width('100%')
      .height('100%')
    }
    .title('IndexPage首页')
    .titleMode(NavigationTitleMode.Mini)
  }
}

子页面:

@Builder
export function PageOneBuilder(){
  PageOne()
}

@Component
struct PageOne {
  @State message: string = 'Hello World123213213';

  pathStack: NavPathStack = new NavPathStack();

  build() {
    NavDestination() {
      Column(){
        Text(this.message)
          .fontSize($r('app.float.page_text_font_size'))
      }
      .width('100%')
      .height('100%')
      .backgroundColor(Color.Black)
    }
    .title('pageOne')
  }
}

module.json5配置

{
  "module": {
    "name": "entry",
    "type": "entry",
    "description": "$string:module_desc",
    "mainElement": "EntryAbility",
    "deviceTypes": [
      "phone",
      "tablet",
      "2in1"
    ],
    "deliveryWithInstall": true,
    "installationFree": false,
    "pages": "$profile:main_pages",
    "routerMap": "$profile:route_map",
    "abilities": [
      {
        "name": "EntryAbility",
        "srcEntry": "./ets/entryability/EntryAbility.ets",
        "description": "$string:EntryAbility_desc",
        "icon": "$media:layered_image",
        "label": "$string:EntryAbility_label",
        "startWindowIcon": "$media:startIcon",
        "startWindowBackground": "$color:start_window_background",
        "exported": true,
        "skills": [
          {
            "entities": [
              "entity.system.home"
            ],
            "actions": [
              "action.system.home"
            ]
          }
        ]
      }
    ],
    "extensionAbilities": [
      {
        "name": "EntryBackupAbility",
        "srcEntry": "./ets/entrybackupability/EntryBackupAbility.ets",
        "type": "backup",
        "exported": false,
        "metadata": [
          {
            "name": "ohos.extension.backup",
            "resource": "$profile:backup_config"
          }
        ],
      }
    ]
  }
}

route_map.json的配置

{
  "routerMap": [
    {
      "name": "PageOne",
      "pageSourceFile": "src/main/ets/pages/PageOne.ets",
      "buildFunction": "PageOneBuilder",
      "data": {
        "description": "this is PageOne"
      }
    }
  ]
}

项目结构: 跳转效果: IndexPage页面

点击跳转子页面:是空白(只有返回箭头)


更多关于HarmonyOS鸿蒙Next应用开发中路由跳转成功但是页面是空白。父页面Navigation跳转子页面NavDestination出现空白的实战教程也可以访问 https://www.itying.com/category-93-b0.html

14 回复

我用你的代码运行的结果

cke_503.png

更多关于HarmonyOS鸿蒙Next应用开发中路由跳转成功但是页面是空白。父页面Navigation跳转子页面NavDestination出现空白的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


基本信息

  • 姓名: 张三
  • 年龄: 28
  • 职位: 软件工程师

技能

  • Java
  • Python
  • C++
  • JavaScript

项目经验

  • 项目一
    • 描述: 开发了一个电商网站
    • 技术: HTML, CSS, JavaScript
  • 项目二
    • 描述: 设计并实现了一个数据分析系统
    • 技术: Python, Pandas, NumPy

问题分析

  1. 子页面中错误创建 NavPathStack 实例

    • 父页面的 Navigation 组件已管理一个 NavPathStackpageStack),子页面无需也不应自行创建新的 NavPathStack。子页面中定义的 pathStack: NavPathStack = new NavPathStack(); 会导致路由上下文不一致,导致页面无法正确渲染。
  2. 子页面未正确关联父级导航栈

    • NavDestination 组件需要依赖父级 Navigation 的导航栈来渲染页面内容。若子页面自行创建导航栈,会脱离父级导航的管理,导致页面空白。

解决方案

步骤1:删除子页面中的多余导航栈实例

修改子页面 PageOne,移除 pathStack 的定义:

@Component
struct PageOne {
    @State message: string = 'Hello World123213213';
    // ❌ 移除这一行(无需自行创建NavPathStack)
    // pathStack: NavPathStack = new NavPathStack();
    build() {
        NavDestination() {
            Column() {
                Text(this.message)
                    .fontSize($r('app.float.page_text_font_size'))
            }
            .width('100%')
            .height('100%')
            .backgroundColor(Color.Black)
        }
        .title('pageOne')
    }
}

步骤2:确保路由配置正确引用Builder

检查 route_map.jsonbuildFunction 是否正确指向子页面的Builder函数(当前配置正确,无需修改):

{
    "routerMap": [
        {
            "name": "PageOne",
            "pageSourceFile": "src/main/ets/pages/PageOne.ets",
            "buildFunction": "PageOneBuilder", // ✅ 正确引用Builder
            "data": {
                "description": "this is PageOne"
            }
        }
    ]
}

步骤3:验证父页面导航栈调用

父页面使用 pushPathByName 跳转时,参数格式正确(路径名 + 携带数据),无需修改:

this.pageStack.pushPathByName("PageOne", "page one"); // ✅ 正确调用

补充说明

  • NavDestination 的作用:该组件用于定义导航目的地,需作为 Navigation 的子组件或依赖其父级导航栈,无需在子页面中手动管理栈实例。
  • 样式排查:若页面背景与文字颜色相同(如黑色背景 + 黑色文字),可能导致内容不可见。建议临时修改子页面背景色或文字颜色,确认是否为样式问题:
Column() {
    Text(this.message)
        .fontSize(20) // 显式设置字体大小,避免使用未定义的资源
        .color(Color.White) // 文字设为白色
}
.backgroundColor(Color.Gray) // 临时背景色,便于调试

总结

核心问题是子页面错误创建了独立的 NavPathStack,导致脱离父级导航管理。移除子页面的导航栈实例后,NavDestination 会自动关联父级 Navigation 的栈,从而正确渲染内容。若仍有问题,可进一步检查:

  1. route_map.json 路径是否正确(确保 pageSourceFile 指向子页面文件)。
  2. 资源引用(如 $r('app.float.page_text_font_size') 是否存在,避免未定义的资源导致布局异常)。

修改后重新编译运行,页面应能正常显示子页面内容。

标题

这是段落一。

这是段落二。

期待HarmonyOS能在未来带来更多创新的技术和理念。

我的版本是这样的

访问不到子页面:path找不到

cke_147.png

这个route_map.json配置应该正确

cke_2807.png

这是module.json5的配置

cke_5900.png

到底是哪里的问题呢?

没有找到router,这个path路径随便换一下,效果就是空白

cke_168.png

背景黑色去掉

理论上:设置背景为黑色的跳转过去整个页面是黑色的
我看您测试的就OK
您的版本是这个吗?

5.0.5(17)

pageone页面中,

.backgroundColor(Color.Black)

你把背景设置成了黑色,字体颜色也是黑色的,把背景去掉后 可以显示啊,其他代码没有问题。

把子页面中NavPathStack的实例删掉后,仍旧不能显示子页面的内容。

IndexPage.ets的内容:

@Entry
@Component
struct IndexPage {

  @State message: string = 'Hello World';
  @Provide('pathStack')  pathStack : NavPathStack = new NavPathStack();

  build() {
    Navigation(this.pathStack){
      Column(){
        Text('IndexPage')
          .fontSize($r('app.float.page_text_font_size'))
        Button('跳转子页面pageOne')
          .fontSize($r('app.float.page_text_font_size'))
          .onClick( ()=>{
              this.pathStack.pushPathByName('PageOne',"page one",true)
          })
      }
      .width('100%')
      .height('100%')
    }
    .title('IndexPage首页')
    .titleMode(NavigationTitleMode.Mini)
  }
}

子页面:PageOne.ets

@Builder
export function PageOneBuilder(){
  PageOne()
}

@Component
export struct PageOne {
  @State message: string = 'PageOne';
  build() {
    NavDestination() {
      Column(){
        Text(this.message)
          .fontSize($r('app.float.page_text_font_size'))
      }
      .width('100%')
      .height('100%')
      .backgroundColor(Color.Black)
    }
    .title('pageOne')
  }
}

效果:

空白:

鸿蒙Next路由跳转空白问题可能原因:

  1. NavDestination页面未正确加载资源
  2. 页面组件树未完整构建
  3. 路由路径配置错误导致加载了空布局
  4. 页面生命周期方法未正常执行

排查方法:

  • 检查NavDestination页面的@CustomDialog@Entry修饰器是否正确定义
  • 验证页面build()方法是否返回了完整UI组件
  • 确认路由URL与目标页面路径完全匹配
  • 检查页面aboutToAppear()生命周期是否被触发

从代码和配置来看,出现空白页面的主要原因是子页面PageOne的结构问题。在HarmonyOS Next中,NavDestination需要正确的构建方式。

主要问题点:

  1. 子页面PageOne中重复定义了pathStack,这是不需要的
  2. NavDestination的构建方式需要调整

修改建议:

@Component
struct PageOne {
  @State message: string = 'Hello World123213213';

  build() {
    Column(){
      Text(this.message)
        .fontSize($r('app.float.page_text_font_size'))
    }
    .width('100%')
    .height('100%')
    .backgroundColor(Color.Black)
  }
}

@Builder
export function PageOneBuilder(){
  NavDestination() {
    PageOne()
  }
  .title('pageOne')
}

关键修改:

  1. 移除子页面中多余的pathStack定义
  2. 将NavDestination的构建逻辑移到Builder函数中
  3. 保持PageOne组件只包含UI内容

这样修改后,路由跳转应该能正常显示子页面内容。确保route_map.json中的buildFunction正确指向PageOneBuilder。

回到顶部