HarmonyOS ArkUI实战开发-页面跳转(Router、Ability)

news/2024/11/30 1:48:45/

页面跳转可以分为页面内跳转和页面间跳转,页面内跳转是指所跳转的页面在同一个 Ability 内部,它们之间的跳转可以使用 Router 或者 Navigator 的方式;页面间跳转是指所跳转的页面属与不同的 Ability ,这种跳转需要借助 featureAbility 实现,跳转示意图如下所示:

本节将简单介绍这两种方式的页面跳转。

页面内跳转

页面内跳转的实现比较简单,直接使用ArkUI开发框架提供的 Router 或者 Navigator 就可以了, Navigator 本质上是对 Router 的封装,这里就简单介绍一下 Router 的使用,想了解 Navigator 的小伙伴请参考官网文档。

router定义介绍

declare namespace router {function push(options: RouterOptions):void;function replace(options: RouterOptions):void;function back(options?: RouterOptions ):void;function clear():void;function getLength():string;function getState():RouterState;function enableAlertBeforeBackPage(options: EnableAlertOptions):void;function disableAlertBeforeBackPage():void;function getParams(): Object;
}
  • push:打开新的页面,新页面在栈顶位置, RouterOptions 定义了以下参数:
    • url:目标页面的路径,该路径必须在 config.json 的 pages 下配置,否则不起作用。
    • params:可选参数,向目标页面传递参数。
  • replace:新页面替换当前页面并把当前页面销毁。
  • back:返回上一页。
  • clear:清空路由栈里的其它页面。
  • getLength:获取当前路由栈里的页面数量。
  • getState:获取当前页面的状态, RouterState参数说明如下:
    • index:当前页面是第几个打开的。
    • path:当前页面的路径。
    • name:当前页面的名称。
  • enableAlertBeforeBackPage
  • disableAlertBeforeBackPage
  • getParams:获取通过路由传递过来的参数。

router使用介绍

  • 引入router

    使用 router 之前,先要引入 router ,引入方式如下:

    import router from '@ohos.router';
  • 页面跳转

    页面跳转使用 router.push 方法,简单样例如下所示:

    // 第一个页面@Entry @Component struct ComponentTest {build() {Column({space: 10}) {Text('第一个页面').fontSize(30).width('100%').textAlign(TextAlign.Center)Button('打开下一页').onClick(() => {router.push({          // 使用push入栈一个新页面url: "pages/second"  // 通过url指定新打开的页面})})}.size({width: '100%', height: '100%'})}}// 第二个页面@Entry @Component struct Second {build() {Column({space: 10}) {Text('第二个页面').fontSize(30).width('100%').textAlign(TextAlign.Center)Button('返回上一页').onClick(() => {router.back(); // 返回上一页,当前页面会销毁})}.size({width: '100%', height: '100%'})}}
  • 参数传递

    当通过 router 打开新页面需要传递参数时,可以使用 RouterOptions 的 params 参数传递一个对象,然后在接收方以 router.getParams() 的方式拿到传递过来的对象,取值的话以 .key 的形式取值(注意:从 3.1.6.5 版本起,取值方式变更为 ['key'] 的形式),样例如下:

    // 第一个页面@Entry @Component struct ComponentTest {build() {Column({space: 10}) {Text('第一个页面').fontSize(30).width('100%').textAlign(TextAlign.Center)Button('打开下一页').onClick(() => {router.push({url: "pages/second",  // 打开新页面params: {value: 'Hi'} // 给新页面传递一个对象,key为value,取值以.value的形式})})}.size({width: '100%', height: '100%'})}}// 第二个页面@Entry @Component struct Second {// 3.1.5.5版本之前,取值方式为:router.getParams().keyprivate value: string = router.getParams().value;// 从3.1.6.5版本起,取值方式为:router.getParams()['key']private value: string = router.getParams()['value'];build() {Column({space: 10}) {Text('第二个页面:' + this.value) // 使用获取过来的参数.fontSize(30).width('100%').textAlign(TextAlign.Center)Button('返回上一页').onClick(() => {router.back();              // 返回上一页})}.size({width: '100%', height: '100%'})}}

📢:感谢 lx2323658175 (opens new window)指出 3.1.6.5 版本 router 的取值方式做了变更,笔者写该电子书时使用的 SDK 版本为 3.1.5.5,该版本的取值方式为 router.getParams().key 的形式,从 3.1.6.5 版本起,取值方式变更为:router.getParams()[‘key’] 的形式,特此说明。

页面间跳转

页面间跳转需要借助 featureAbility 模块的 startAbility() 方法,该方法和 router 的功能类似,可以支持参数传递以及打开指定页面等。

featureAbility定义介绍

declare namespace featureAbility {/**省略部分方法*/function startAbility(parameter: StartAbilityParameter, callback: AsyncCallback<number>): void;function startAbility(parameter: StartAbilityParameter): Promise<number>;function startAbilityForResult(parameter: StartAbilityParameter, callback: AsyncCallback<AbilityResult>): void;function startAbilityForResult(parameter: StartAbilityParameter): Promise<AbilityResult>;
}
  • startAbility:打开指定 Ability ,在不指定开目标 Ability 里的页面时,则默认打开 Ability 的第一个页面。
    • parameter:设置打开 Ability 的参数,说明如下:
      • want:打开目标 Ability 的配置项。
        • bundleName:目标 Ability 的包名称。
        • abilityName:目标 Ability 的全路径。
        • params:传递给目标 Ability 的参数。可以在该参数里指定需要打开的页面。

打开Ability的默认首页面

  1. 创建第二个 Ability ,依次点击 File -> new -> Ablity -> Empty Page Ability(eTS) ,添加 SettingAbility ,如下图所示:

点击 Finish 后, OpenHarmony 代码结构如下图所示:

  1. 在 default 的 pages 下的 index.ets 添加跳转功能:引入 featureAbility 模块,然后通过 featureAbility 的 startAbility() 方法打开目标 Ability。
    // 引入featureAbilityimport featureAbility from '@ohos.ability.featureAbility';@Entry @Component struct Index {build() {Column() {Button('open about ability').onClick(() => {// 打开目标AbilityfeatureAbility.startAbility({want: {// 目标Ability所在的bundleName,也就是config.json里配置的bundleNamebundleName: "com.example.myapplication",// 目标Ability的全路径abilityName: "com.example.myapplication.SettingAbility"}}).then((data) => {console.info('Operation successful. Data: ' + JSON.stringify(data))}).catch((error) => {console.error('Operation failed. Cause: ' + JSON.stringify(error));})})}.padding(10).width('100%').height('100%')}}
  1. 修改SettingAbility的默认首页面,添加如下文案:
    @Entry @Component struct Index {build() {Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {Text('我是SettingAbility的默认首页面').fontSize(50).fontWeight(FontWeight.Bold)}.width('100%').height('100%')}}

打开Ability的指定页面

  1. 在 SettingAbility 的 pages 下添加第二个页面:second.ets,代码如下所示:
    @Entry @Component struct Second {build() {Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {Text('你好,我是SettingAbility的第二个页面').fontSize(50).fontWeight(FontWeight.Bold)}.width('100%').height('100%')}}
  1. 修改打开 Ability 的代码,添加 url 参数,代码如下:
    featureAbility.startAbility({want: {bundleName: "com.example.myapplication",abilityName: "com.example.myapplication.SettingAbility",// 添加uri参数,指定打开SettingAbility下的second页面。uri: "pages/second"}}).then((data) => {console.info('Operation successful. Data: ' + JSON.stringify(data))}).catch((error) => {console.error('Operation failed. Cause: ' + JSON.stringify(error));})

小结

本节简单介绍了页面内和页面间的跳转方法以及在跳转过程中的参数传递和取值,另外请读者看一个场景:从不同的页面跳转到B页面,但是B页面需要登录才可以跳转,一般做法是在打开B页面时判断是否登录,如果登录了直接跳转B页面否则跳转登录页面去登录,登录成功后再跳转B页面。

码牛课堂也为了积极培养鸿蒙生态人才,让大家都能学习到鸿蒙开发最新的技术,针对一些在职人员、0基础小白、应届生/计算机专业、鸿蒙爱好者等人群,整理了一套纯血版鸿蒙(HarmonyOS Next)全栈开发技术的学习路线。大家可以进行参考学习:https://qr21.cn/FV7h05

①全方位,更合理的学习路径
路线图包括ArkTS基础语法、鸿蒙应用APP开发、鸿蒙能力集APP开发、次开发多端部署开发、物联网开发等九大模块,六大实战项目贯穿始终,由浅入深,层层递进,深入理解鸿蒙开发原理!

②多层次,更多的鸿蒙原生应用
路线图将包含完全基于鸿蒙内核开发的应用,比如一次开发多端部署、自由流转、元服务、端云一体化等,多方位的学习内容让学生能够高效掌握鸿蒙开发,少走弯路,真正理解并应用鸿蒙的核心技术和理念。

③实战化,更贴合企业需求的技术点
学习路线图中的每一个技术点都能够紧贴企业需求,经过多次真实实践,每一个知识点、每一个项目,都是码牛课堂鸿蒙研发团队精心打磨和深度解析的成果,注重对学生的细致教学,每一步都确保学生能够真正理解和掌握。

为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

鸿蒙开发学习手册》:https://qr21.cn/FV7h05

如何快速入门:

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. ……

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ……

基于ArkTS 开发:https://qr21.cn/FV7h05

  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 网络与链接
  8. 电话服务
  9. 数据管理
  10. 后台任务(Background Task)管理
  11. 设备管理
  12. 设备使用信息统计
  13. DFX
  14. 国际化开发
  15. 折叠屏系列
  16. ……

鸿蒙开发面试真题(含参考答案):https://qr21.cn/FV7h05

大厂鸿蒙面试题::https://qr18.cn/F781PH

鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH

1.项目开发必备面试题
2.性能优化方向
3.架构方向
4.
鸿蒙开发系统底层方向
5.鸿蒙音视频开发方向
6.鸿蒙车载开发方向
7.鸿蒙南向开发方向


http://www.ppmy.cn/news/1431261.html

相关文章

linux系统安全与应用【下】

目录 1.开关机安全控制 1.1GRUB限制 2.终端登录安全控制 2.1 限制root只在安全终端登录 2.2 禁止普通用户登录 3.弱口令检测 3.1 Joth the Ripper&#xff08;JR&#xff09; 4.网络端口扫描 4.1 nmap命令 1.开关机安全控制 1.1GRUB限制 通常情况下在系统开机进入GRU…

工业级路由器如何异地组网及其作用

在传统行业中&#xff0c;随着技术的不断进步和数字化转型的加速&#xff0c;异地组网成为了提升工作效率、降低运营成本、增强企业灵活性的重要手段。工业级路由器作为实现异地组网的关键设备&#xff0c;其在企业网络架构中发挥着不可替代的作用。本文将详细解释工业级路由器…

我在本地部署通义千问Qwen1.5大模型,并实现简单的对话和RAG

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学&#xff0c;针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 汇总…

STM32自动光控窗帘程序+Proteus仿真图 H桥L298驱动电机

目录 1、前言 2、仿真图 3、源程序 资料下载地址&#xff1a;STM32自动光控窗帘程序Proteus仿真图 H桥L298驱动电机 1、前言 基于STM32F103设计的智能光控窗帘&#xff0c;包含STM32芯片、光敏电阻、LCD1602显示屏、电机驱动控制模块等。 备注&#xff1a;通过ARM内部的…

ESP32与SD卡交互实现:文件读写实战与初始化详解及引脚定义

本代码实现ESP32与SD卡的交互&#xff0c;包括定义SPI引脚、创建自定义SPI类实例、编写WriteFile与ReadFile函数进行文件读写。setup函数初始化串口、SPI、SD卡&#xff0c;向“/test.txt”写入“myfirstmessage”&#xff0c;读取并打印其内容。loop函数留空待扩展。 1. 需要…

小游戏:贪吃蛇

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;贪吃蛇 &#x1f337;追光的人&#xff0c;终会万丈光芒 目录 &#x1f3dd;1.头文件&#xff1a; &#x1f3dd;2.实现文件&#xff1a; &#x1f3dd;3.测试文件 &#xff1a; 前言&#…

单片机 VS 嵌入式LInux (学习方法)

linux 嵌入式开发岗位需要掌握Linux的主要原因之一是&#xff0c;许多嵌入式系统正在向更复杂、更功能丰富的方向发展&#xff0c;需要更强大的操作系统支持。而Linux作为开源、稳定且灵活的操作系统&#xff0c;已经成为许多嵌入式系统的首选。以下是为什么嵌入式开发岗位通常…

Leetcode - 周赛394

目录 一&#xff0c;3120. 统计特殊字母的数量 I 二&#xff0c;3121. 统计特殊字母的数量 II 三&#xff0c;3122. 使矩阵满足条件的最少操作次数 四&#xff0c;3123. 最短路径中的边 一&#xff0c;3120. 统计特殊字母的数量 I 本题就是统计有多少个字母的大小写同时出现…