HarmonyOS 鸿蒙Next中页面间数据传递有哪些途径或方法?

发布于 1周前 作者 nodeper 来自 鸿蒙OS

HarmonyOS 鸿蒙Next中页面间数据传递有哪些途径或方法?

方式不限,越多越好,来秀一下你的鸿蒙知识吧~

8 回复
写个单例类,跳转页面时将参数内容存进去,目标页面随时随地可以取数据~~~

更多关于HarmonyOS 鸿蒙Next中页面间数据传递有哪些途径或方法?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


HmRouter是开源组件,鸿蒙原生也提供了两个组件进行页面路由,传参,分别是Router、Navigation。

当前鸿蒙推荐使用Navigation进行页面路由。

在鸿蒙管网中,有相关指导文档

router路由传参Api:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-router-V5#导入模块

Navigation路由传参Api:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/ts-basic-components-navigation-V5#pushpath10

Api中有各种路由跳转时页面传参方式

可以使用HMRouter路由框架进行页面间的跳转和参数传递

1. 为需要跳转的页面添加[@HMRouter](/user/HMRouter)注解,并配置其中的pageUrl参数,例如此处配置为ProductContent。

[@HMRouter](/user/HMRouter)({ pageUrl: 'ProductContent' })
[@Component](/user/Component)
export struct ProductContent {
  // ...
}

2. 在需要进行页面跳转的位置,使用HMRouterMgr提供的push/replace方法进行页面跳转,在参数中配置目标页面的pageUrl,param参数等

HMRouterMgr.push({
  navigationId: "mainNavigationId",
  pageUrl: 'ProductContent',
  param: { a: 1, b: 2 },
  animator: new CustomAnimator(),
}, {
  onResult(popInfo: HMPopInfo) {
    const pageName = popInfo.srcPageInfo.name;
    const params = popInfo.result;
    console.log(`page name is ${pageName}, params is ${JSON.stringify(params)}`);
  }
})

3. 在跳转的目标页面使用HMRouterMgr.getCurrentParam()获取到传递的数据

[@Component](/user/Component)
export struct ProductContent {
  // ...
  [@State](/user/State) param: ParamsType | null = null;

aboutToAppear(): void { this.param = HMRouterMgr.getCurrentParam() as ParamsType; }

// … }

具体实践参考:https://developer.huawei.com/consumer/cn/doc/best-practices-V5/bpta-hmrouter-V5#section16933185617575

两个UIAbility之间 数据传递的方法如下,推荐优先使用排序靠前的方法。

  1. 方法一:调用startAbility接口启动另外一个UIAbility时,通过wantInfo添加启动参数。也可通过startAbilityForResult接口,获取被调用方UIAbility在关闭时返回的信息

  2. 方法二:使用应用级别的状态管理AppStorage、PersistentStorage、Environment,实现应用级或者多个页面的状态数据共享。

  3. 方法三:同一个应用中UIAbility和UIAbility之间的数据传递,可以使用AppStorage/LocalStorage进行数据同步。

  4. 方法四:使用线程间通信工具Emitter、Worker进行通信。

  5. 方法五:使用进程间通信工具CES(公共事件服务)进行通信。

  6. 其他方法(系统应用):通过Call调用实现UIAbility交互。

参考链接

UIAbility组件间交互(设备内)管理应用拥有的状态概述UIAbility组件与UI的数据同步线程模型概述进程间通信CES

https://developer.huawei.com/consumer/cn/forum/topic/0204141303961614256?fid=0109140870620153026

  • AppStorage
  • EventHub
  • startAbility
  • router
  • Navigation
  • 发布订阅(具体内容印象模糊)
startAbility也可以吧?通过 startAbility 方法可以启动其他 Ability 或者同一应用内的其他页面(可以将其视为一种特殊的 Ability),在启动时可以通过 Want 对象来携带参数,然后在目标页面中获取并解析这些参数。

注意区分UIAbility组件和UI,UIAbility组件不等于UI(页面),参考https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V13/uiability-intra-device-interaction-V13。看起来通过startAbility(),页面只能传递参数到(其他)UIAbility组件,而不是传到其他页面。

在HarmonyOS 鸿蒙Next中,页面间数据传递主要通过以下几种途径或方法:

  1. 全局状态管理:利用系统提供的全局状态管理工具(如DataAbility),将数据存储在全局变量中,各页面通过访问这些全局变量实现数据共享。

  2. Intent机制:通过显式或隐式Intent携带数据,在启动目标页面时传递。Intent可以携带基本数据类型、对象以及序列化后的数据。

  3. 消息总线:利用系统提供的消息总线机制(如Event Bus),发布和订阅事件,实现页面间异步通信和数据传递。

  4. Service通信:通过定义AIDL接口或DataAbility API,实现页面与Service之间的数据交换,再由Service将数据传递给其他页面。

  5. 跨进程通信:对于需要跨应用传递的数据,可利用系统提供的跨进程通信机制(如分布式数据库),实现数据的远程访问和共享。

  6. URI共享:通过生成数据的URI,并在页面间传递该URI,接收方通过URI访问数据。

这些方法提供了丰富的页面间数据传递手段,根据具体需求选择合适的方式即可。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html。

回到顶部