HarmonyOS鸿蒙Next中使用navigation模块进行页面跳转时代码未报错,虚拟设备运行正常,但未能实现页面跳转

HarmonyOS鸿蒙Next中使用navigation模块进行页面跳转时代码未报错,虚拟设备运行正常,但未能实现页面跳转

【设备信息/系统版本】:HarmonyOS 5.0.5
【API版本】: api17
【DevEco Studio版本】: 5.0.13.200

【问题描述】:

使用navigation模块中的pageStack.pushPathByName进行跳转的时候,日志提示已经执行跳转,但是页面却没有变化,另外日志中记录了以下三条wrong:

1、W:[] GetDecorHeight(2235): Get app window decor height failed

2、W:18:FFRTQosApplyForOther:244 tid 11634, Interrupted system call, ret:-1, eno:4

3、W:19:~WorkerThread:72 to exit, qos[4]

PS:另外每一个项目有且只能有一个@Entry修饰器吗?为什么存在多个页面时,有些页面删除@Entry修饰器会报错:A page configured in ‘main_pages.json or build-profile.json5’ must have one and only one ‘@Entry’ decorator. <ArkTSCheck>,但又不影响正常执行??

【问题相关代码】:

page1:

page2

【尝试过的方法和结果】:在page2中添加生命周期管理:

【最终目标】:

1、找出页面未能跳转的具体原因;

2、提出优化及相关知识的建议。


更多关于HarmonyOS鸿蒙Next中使用navigation模块进行页面跳转时代码未报错,虚拟设备运行正常,但未能实现页面跳转的实战教程也可以访问 https://www.itying.com/category-93-b0.html

6 回复

你的路由方式使用的是组件路由(Navigation路由区别于Router,前者有且仅有一个@Entry页面),

以下是路由栈信息的代码,它必须由@Entry开始往下层使用到的地方传递(@Provide@Consume),或者使用全局状态(AppStorage)的方式进行同步

@Entry页面中:

[@Provide](/user/Provide)("pageInfo")
pageInfo: NavPathStack = new NavPathStack()

在使用到路由栈的页面:

[@Consume](/user/Consume)('pageInfo')
pageInfo: NavPathStack

被跳转的页面的根节点必须被NavDestination包裹,且须声明一个全局自定义构建函数

@Component
struct XxxView {
  build() {
    NavDestination() {
       // 页面内容
    }
    .hideTitleBar(true)
    .hideToolBar(true)
  }
}

@Builder
export function XxxViewBuilder() {
  XxxView()
}

在profile/xxx.json中注册路由信息

{
  "routerMap": [
    {
      "name": "XxxView",
      "pageSourceFile": "src/main/ets/view/XxxView.ets",
      "buildFunction": "XxxViewBuilder"
    }
  ]
}

在 module.json5 中添加以下字段

{
  "module": {
     // ...
    "routerMap": "$profile:Xxx",// Xxx为你profile文件夹下注册路由的Xxx.json文件名
    // ...
  }
}

把 main_pages.json 文件删掉就行了,原因是你在这个文件中注册了这个页面(这个页面必须是带@Entry装饰器的页面),但是你又把这个页面的 @Entry 删掉了,所以会报错。

更多关于HarmonyOS鸿蒙Next中使用navigation模块进行页面跳转时代码未报错,虚拟设备运行正常,但未能实现页面跳转的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


跳转问题解决了,但是@Entry这个问题依旧存在,我是将main_pages.json文件中的除了@Entry页面的其他页面均删除,在没有@Entry的其他页面均爆红:A page configured in ‘main_pages.json or build-profile.json5’ must have one and only one ‘@Entry’ decorator. (该问题不影响程序正常运行,但是一直爆红不好看)

将其他没有带 @Entry 的页面移出 pages 文件夹,不要放到一起,main_pages.json 会识别到。

完美解决,非常感谢你!!!

鸿蒙Next中navigation模块页面跳转失败可能原因:

  1. 路由配置未在main_pages.json中正确声明
  2. 目标页面路径拼写错误或未使用绝对路径
  3. 页面生命周期未正确处理,如未调用onPageShow
  4. 页面栈管理异常导致跳转被拦截
  5. 组件类型不匹配,如使用CustomDialog替代Page

检查要点:

  • 确保目标页面已注册
  • 路径格式应为"pages/xxx/xxx"
  • 使用router.pushUrl方法时确认option参数正确,

关于页面跳转失败的问题,可能原因如下:

  1. 路由配置问题:
  • 检查main_pages.json中是否正确定义了目标页面路径
  • 确保page2的路径与pushPathByName参数完全匹配(注意大小写)
  1. 页面生命周期问题:
  • 虽然添加了生命周期函数,但建议检查onPageShow是否被触发
  • 可以尝试在page2的aboutToAppear中添加日志确认页面加载
  1. @Entry修饰器问题:
  • 每个在main_pages.json中配置的页面必须且只能有一个@Entry修饰器
  • 报错但能运行可能是因为IDE缓存,建议执行Build -> Clean Project
  1. 日志中的警告:
  • GetDecorHeight错误通常不影响功能,可能是模拟器问题
  • FFRTQos警告属于系统级线程调度问题,一般不影响应用逻辑

建议检查:

  1. 确认page2的路由路径是否在router.pushPathByName中正确使用
  2. 在page2的aboutToAppear中添加console.log确认页面加载
  3. 检查是否在page1的跳转回调中有页面拦截逻辑
回到顶部