当某个页面(这里为页面2)的systemTransition属性设置为None时:

@Component
struct Page02 {
  pathStack: NavPathStack | undefined = undefined;

  build() {
    NavDestination() {
......
    }.title('页面2')
    .backgroundColor('#ffffdbdb')
    .systemTransition(NavigationSystemTransitionType.NONE)
    .onReady((context: NavDestinationContext) => {
      this.pathStack = context.pathStack;
    })
  }
}

如果在页面2里先pop再push一个页面3,会发现页面2会停留一会然后跳转到页面3,具体操作如下:

Button(`pop, push Page03 (normal)`).width('80%').margin({ top: 10, bottom: 10 })
  .onClick(() => {
    this.pathStack?.pop();
    this.pathStack?.pushPath({ name: 'Page03' });
  })

效果如下:

这是因为在进行跳转时,一般情况下,如果跳转后,栈顶页面不在栈中(这里表现为页面2被pop出栈),那么跳转就会执行pop动画。

在pop动画中,栈顶页面(这里为页面2)会一直处于最上层,直到动画结束才会消失,所以整个动画过程中(不到500ms左右)页面2会一直在屏幕上,视觉效果就是页面2延迟跳转。

这个场景可以使用NEW_INSTANCE来规避,有了NEW_INSTANCE,即使跳转后栈顶页面不在栈中,跳转也会执行push动画。

在push动画中,新的栈顶页面(这里为页面3)会一直处于最上层,而原先的栈顶页面(这里为页面2)会被新的栈顶页面遮住,这样视觉效果就是只有页面3在做push动画,示例如下:

Button(`pop, push Page03 (normal)`).width('80%').margin({ top: 10, bottom: 10 })
  .onClick(() => {
    this.pathStack?.pop();
    this.pathStack?.pushPath({ name: 'Page03' }, { launchMode: LaunchMode.NEW_INSTANCE });
  })

效果如下:

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐