HarmonyOS鸿蒙Next中主页面MainPage作为Navigation根容器是否可更换为其他页面?

HarmonyOS鸿蒙Next中主页面MainPage作为Navigation根容器是否可更换为其他页面? 主页面MainPage作为Navigation根容器 中途业务层面报错需要跳到指定的页面,且返回后应该是回到桌面而不是又回到主页面,这里的根容器所在的主页面是否可以替换呢?

11 回复

尊敬的开发者,您好,Navigation页面为根页面,根页面无法被this.pageInfos.replacePathByName替换,调用该方法之后,页面依旧会保留在栈顶。如果需要实现页面替换的类似效果,可以参考以下方案:

在根页面当中定义一个状态变量,通过该状态变量控制Navigation根页面显示内容,代码案例参考如下:

@Entry
@Component
struct Index {
  @Provide pageInfos: NavPathStack = new NavPathStack();
  @State  isShowIndex: boolean = false

  build() {
    Navigation(this.pageInfos) {
      if (this.isShowIndex) {
        Column() {
          Text('跳转页面')
            .fontSize(30)
            .fontWeight(FontWeight.Medium)
            .onClick(() => {
              this.pageInfos.pushPathByName('Page1', null)
            })
        }
        .width('100%')
        .height('100%')
      } else {
        SplashPage({
          onChangePage: () => {
            this.isShowIndex = true
          }
        })
      }
    }
  }
}

@Component
export struct SplashPage {
  onChangePage: VoidCallback = () => undefined;

  aboutToAppear(): void {
    setTimeout(() => {
      this.onChangePage()   // 延时触发切换(模拟启动页逻辑)
    }, 3000);
  }

  build() {
    Column({space: 15}) {
      Image($r('app.media.startIcon'))
        .width(100)
        .height(100)

      Text('这个是启动页...')
        .fontSize(30)
        .fontWeight(FontWeight.Medium)

      Button('跳转至首页')
        .onClick(() => {
          this.onChangePage()
        })
    }
    .height('100%')
    .width('100%')
    .justifyContent(FlexAlign.Center)
  }
}

更多关于HarmonyOS鸿蒙Next中主页面MainPage作为Navigation根容器是否可更换为其他页面?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


确认下,是要主动回到桌面吗?

  1. 如果单ability可以用UIAbilityContext的terminateSelf主动结束当前ability回到桌面。
    返回的地方调用:
let context = this.getUIContext().getHostContext() as common.UIAbilityContext;
context.terminateSelf();

如需其他结束方式。参考《UIAbilityContext》API。

  1. 如果必须替换Navigation页,可以在Navigation页加个状态变量,控制换页面。
    在报错需要跳转到指定页,这个指定页就是Navigation页,navPathStack.clear()的时候把状态变量改下。
    Navigation页:
  @Provide('navPathStack') navPathStack: NavPathStack = new NavPathStack();
  @Provide('stype') startType:number = 0;

  build() {
    Navigation(this.navPathStack){
      if(this.startType === 1){
       //TODO 报错页面返回来的
      }else{
        //TODO 正常打开的
      }
    }.navDestination(pagesMap)
  }

报错页,准备跳转。

  @Consume('navPathStack') navPathStack:NavPathStack;
  @Consume('stype') startType:number = 5;

  build() {
    NavDestination(){
      Column({space:10}){
        Button('去指定页(回Navigation页)')
          .onClick((e)=>{
            this.startType = 1;
            this.navPathStack.clear();
          })
      }.width('100%')
      .alignItems(HorizontalAlign.Center)
    }
  }

一般来说,Navigation的第一个NavDestination会作为首页显示。但你自己可以通过一个自定义页面将它设置为实际首页,并隐藏默认的导航栏:

首先,在Navigation的入口组件(如@Entry修饰的组件)中,将hideNavBar属性设置为true以隐藏默认首页。

然后在aboutToAppear生命周期中,使用NavPathStack的pushPathByName方法将你的自定义页面(例如MainPage)入栈,使其成为实际展示的首页。

最后通过setInterception方法设置页面跳转拦截回调。当检测到返回操作的目标是导航栏(即to === ‘navBar’)时,再次将自定义首页入栈,从而确保始终以你的页面作为根视图。

至于报错返回,这个感觉还是比较容易的,直接清空路由栈,把目标页面变成错误页面就行了。最后在错误页面拦截返回事件并返回桌面在错误页面对应的NavDestination中,重写onBackPressed回调

this.navPathStack.clear(); // 清空所有历史
this.navPathStack.pushPath({ name: "ErrorPage" });

找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:https://www.bilibili.com/video/BV1S4411E7LY/?p=17

可以,但不建议直接“替换 MainPage”。

HarmonyOS Navigation 的根页面本质是:

Navigation(this.navPathStack)

真正决定页面栈的是 NavPathStack

你这个场景更推荐:

业务异常时:

直接:

this.navPathStack.clear()
this.navPathStack.pushPathByName('ErrorPage')

这样:

  • MainPage 会被清空
  • ErrorPage 变成新的栈顶页面

此时用户返回:

因为栈已经空了,

会直接退出应用 / 回桌面。

不要:

router.replaceUrl()

或者再 push 一个页面。

否则返回时:

还会回到 MainPage。

核心思路其实就是:

异常场景下:

把 Navigation 的页面栈清空。

而不是“替换根容器”。

推荐标准写法:

this.navPathStack.clear()

this.navPathStack.pushPath({
  name: 'LoginPage'
})

或者:

this.navPathStack.replacePath({
  name: 'LoginPage'
})

但:

如果希望返回直接退桌面,

还是:

clear + push

最稳。

Navigation 作为根容器时,其内部的页面栈(NavPathStack)只能操作子页面,无法直接替换掉最外层的根页面本身。

用route替换跳转,根容器就变了,

这样返回就是桌面了,

在HarmonyOS Next中,Navigation根容器可以更换。通过修改EntryAbility中windowStage.loadContent传入的页面组件(如将MainPage替换为其他Page),或在Navigation内部使用NavPathStack的replacePath接口动态替换根页面栈。例如:this.navPathStack.replacePath(['YourPage'])

在 HarmonyOS Next 中,Navigation 组件的根页面并非固定不可变。
你可以通过操作 NavPathStack 来动态替换根容器。当业务报错需要跳转到指定页面并让返回键直接回到桌面,而非回到原首页时,可以先将栈内所有页面清除,再将目标页面作为新的根页面入栈,例如调用 clear() 后使用 pushDestination 或直接通过 replace 方法替换栈底页面。
对于“返回回到桌面”,可在新页面监听 onBackPress 并触发应用退到后台的能力(如使用 window.minimizeabilityContext.terminateSelf 等),从而实现“不回主页面”的效果。因此根页面是可替的。

回到顶部