【页面路由导航】页面跳转传递NavPathStack对象实例方法(AppStorage方式)

28 阅读2分钟

Navigation是路由容器组件,一般作为首页的根容器。Navigation组件适用于模块内和跨模块的路由切换,一次开发,多端部署场景。通过组件级路由能力实现更加自然流畅的转场体验,并提供多种标题栏样式来呈现更好的标题和内容联动效果。

在之前的文章中有介绍如何实现页面的跳转,在页面跳转时,需要传递NavPathStack对象实例,以保证不同的页面中,页面的操作有效性和一致性。

NavPathStack对象传递主要有四种方法。

  1. 子页面通过OnReady回调获取(在【页面路由导航】三步实现页面跳转的完整示例 中有介绍)。

  2. 通过全局的AppStorage接口设置获取。

  3. 通过@Provide和@Consume装饰器,将NavPathStack变量传递给子页面。

  4. 通过自定义组件查询接口获取。

本篇内容基于【页面路由导航】三步实现页面跳转的完整示例 之上,通过全局的AppStorage接口设置获取NavPathStack对象实例,主要实现如下。

第一步:在一个公共文件中,实现全局PathStack的保存及获取方法

export function  savePathStack() {
  let pathStack = new NavPathStack();
  AppStorage.setOrCreate("PathStack", pathStack)
}

export function  getPathStack(): NavPathStack {
  let pathStack: NavPathStack = AppStorage.get("PathStack") as NavPathStack
  return pathStack
}

第二步:在UIAbility的子类(默认是EntryAbility)的onWindowStageCreate中,增加对savePathStack()的调用。

onWindowStageCreate(windowStage: window.WindowStage): void {
  savePathStack();
  // ...
  windowStage.loadContent('pages/Index', (err) => {
    if (err.code) {
      hilog.error(0x0000, 'testTag', 'EntryAbility Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');
      return;
    }
    hilog.info(0x0000, 'testTag', 'EntryAbility Succeeded in loading the content.');
  });
}

第三步:在主页面及子页面中,通过getPathStack() 获取NavPathStack对象实例

@Entry
@Component
struct Index {
  pageStack: NavPathStack = getPathStack();  // 将 pageStack: NavPathStack = new NavPathStack(); 替换
  build() {
    Navigation(this.pageStack) {
      Column() {
        
      }
    }
    .hideTitleBar(true)
  }
}
@Entry
@Component
struct SecondPage_Nav {
  pageStack: NavPathStack = getPathStack();  // 将 pageStack:NavPathStack|null = null; 替换
  build() {
    NavDestination() {
      
    }
    .title('SecondPage_Nav')
    .onReady((context: NavDestinationContext) => {
      // this.pageStack = context.pathStack; // 这句不需要了
    })
  }
}
这三步完成后,通过AppStorage实现传递NavPathStack对象实例的主体完成。