HarmonyOS 鸿蒙Next中如何实现复杂路由跳转和参数传递

HarmonyOS 鸿蒙Next中如何实现复杂路由跳转和参数传递

如何在 HarmonyOS NEXT 中实现复杂路由跳转和参数传递?

3 回复

navigation组件提供了更强的自定义能力和功能,适用于实现更复杂的路由跳转。例如,可以从应用入口模块的页面NavigationPage跳转到Login子业务模块页面LoginPage 。这种跳转不仅可以传递参数,还可以管理页面间的关系,避免了页面间的强耦合。

参考:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-navigation-navigation-V5#%E9%A1%B5%E9%9D%A2%E8%B7%B3%E8%BD%AC

更多关于HarmonyOS 鸿蒙Next中如何实现复杂路由跳转和参数传递的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next系统中,实现复杂路由跳转和参数传递通常涉及以下几个步骤:

  1. 定义路由信息:首先,在应用的配置文件中定义好各个页面(或组件)的路由信息,包括路径、参数类型等。这有助于系统识别和解析路由请求。

  2. 构建路由请求:在需要进行路由跳转的地方,根据目标页面的路由信息构建路由请求。这包括设置目标页面的路径、传递的参数等。参数可以是以键值对形式存在的简单数据,也可以是复杂对象。

  3. 发起路由跳转:使用系统提供的API发起路由跳转请求。在跳转过程中,系统会自动解析路由请求中的参数,并将其传递给目标页面。

  4. 接收并处理参数:在目标页面中,通过系统提供的接口接收传递过来的参数,并根据需要进行处理。这可以包括解析参数、更新页面状态等。

值得注意的是,HarmonyOS鸿蒙Next系统对路由跳转和参数传递提供了丰富的支持和优化,但开发者仍需确保路由信息的准确性和参数类型的匹配性,以避免跳转失败或参数传递错误。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

Navigation常见场景&解决方案

路由跳转场景

页面跳转是路由最常用的能力,Navigation通过NavPathStack提供了诸多方法,下文以pushDestination方法为例,介绍Navigation的路由跳转相关能力。

页面间跳转

NavPathStack提供了路由管理的能力,通过NavPathStack进行页面跳转,主要适用于页面较多的应用。

Step1:创建NavPathStack对象pageStack,通常使用@Provide进行修饰,方便后续子组件通过@Consumer获取,以实现子页面的路由跳转。也可以将pageStack传入路由框架,以实现路由框架开发(后续路由框架章节会介绍)的开发

@Entry

@Component

struct mainPageView {

  [@Provide](/user/Provide)('pageStack') pageStack: NavPathStack = new NavPathStack()

  ...

  build() {

    ...

  }

}

Step2:构建路由表pageMap,该方法通过@Builder进行修饰,通过传入的pageName属性,返回不同页面。

@Entry

@Component

struct mainPageView {

  [@Provide](/user/Provide)('pageStack') pageStack: NavPathStack = new NavPathStack()

  [@Builder](/user/Builder)

  PageMap(pageName: string) {

    if (pageName === 'loginPage') {

      loginPageView()

    } else if (pageName === 'mainPage') {

      mainPageView()

    }

  }

  build() {

    ...

  }

}

Step3:在build创建Navigation组件(需要传入pageStack参数),通过navDestination属性传入路由表pageMap,并通过pageStack.pushPath()实现页面跳转。

@Entry

@Component

struct mainPageView {

  [@Provide](/user/Provide)('pageStack') pageStack: NavPathStack = new NavPathStack()

  [@Builder](/user/Builder)

  pageMap(pageName: string) {

    if (pageName === 'loginPage') {

      loginPageView()

    } else if (pageName === 'mainPage') {

      mainPageView()

    }

  }

  build() {

    Navigation(this.pageStack){

      ...

      Button('login').onClick( ent => {

        let pathInfo : NavPathInfo = new NavPathInfo('loginPage', null)

        this.pageStack.pushDestination(pathInfo, true);

      })

    }.navDestination(this.pageMap)

    ...

  }

}

页面间参数传递

Navigation的页面间,通过NavPathInfo对象中的params属性,实现从发起页到目标页的数据传递;通过onPop回调参数,实现处理目标页面的返回。

Step1:构建NavPathInfo对象,输入需要传递给目标页面的参数。params参数:将需要传递的数据封装起来进行传递。onPop参数:目标页面触发pop时的返回,在回调中通过PopInfo.info.param获取到返回的对象。

// 发起页 mainPage

let loginParam : LoginParam = new LoginParam()

// 构建pathInfo对象

let pathInfo : NavPathInfo = new NavPathInfo('loginPage', loginParam

  , (popInfo: PopInfo) => {

    let loginParam : LoginParam = popInfo.info.param as LoginParam;

    ...

  })
this.pageStack.pushDestination(pathInfo, true);   

// 讲参数传递到目标页

 
Step2:目标页面在NavDestinationonReady函数中,通过通过cxt.pathInfo.param,获取传递过来的参数。

build() {

  NavDestination(){

    ...

  }.hideTitleBar(true)

  .onReady(cxt => {

    this.loginParam = cxt.pathInfo.param as LoginParam;

    ...

  })

}

Step3:目标页通过NavPathStack.pop方法返回起始页,其result参数用来传递需要返回给起始页的对象。

@Component

export struct loginPageView {

  @Consume('pageInfo') pageStack : NavPathStack;

  // 页面构建的对象

  private loginParam! : LoginParam;

  ...

  build() {

    NavDestination(){

      ...

      Button('login').onClick( ent => {

        // 将对象返回给起始页

        this.pageStack.pop(this.loginParam, true)

      })

    }

  }

}

跨模块页面跳转

当应用模块较多,需要使用HSP(HAR)进行多模块开发,比如登录模块是一个独立团队开发,以HSP(HAR)的形式交付。此时主页应当从mainPage跳转到HSP(HAR)中的页面,需要先导入模块的自定义组件,将组件添加到pageMap中,再通过pushDestination进行跳转。

Step1:从HSP(HAR)中完成自定义组件(需要跳转的目标页面)开发,将自定义组件申明为export。

@Component

export struct loginPageInHSP {

  @Consume('pageStack') pageStack: NavPathStack;

  ...

  build() {

    NavDestination() {

      ...

    }

  }

}

Step2:在HSP(HAR)的index.ets中导出组件。

export { loginPageInHSP } from "./src/main/ets/pages/loginPageInHSP"

Step3:配置好HSPHAR)的项目依赖后,在mainPage中导入自定义组件,并添加到pageMap中,即可正常调用。

// 导入模块目标页自定义组件

import { loginPageInHSP } from 'library/src/main/ets/pages/loginPageInHSP'

@Entry

@Component

struct mainPage {

  [@Provide](/user/Provide)('pageStack') pageStack: NavPathStack = new NavPathStack()

  [@Builder](/user/Builder) pageMap(name: string) {

    if (name === 'loginPageInHSP') {

      // 路由到hsp包中的登录页面

      loginPageInHSP()

    }

  }

  build() {

    Navigation(this.pageStack) {

      Button("login With HSP module")

        .onClick(() => {

          let loginParam : LoginParamInHSP = new LoginParamInHSP()

          let pathInfo : NavPathInfo = new NavPathInfo('loginPageInHSP', loginParam, (popInfo: PopInfo) => {})

          this.pageStack.pushDestination(pathInfo, true);

        })

    }

    .navDestination(this.pageMap)

  }

}
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!