UIAbility組件與UI的數(shù)據(jù)同步
基于當(dāng)前的應(yīng)用模型,可以通過(guò)以下幾種方式來(lái)實(shí)現(xiàn)UIAbility組件與UI之間的數(shù)據(jù)同步。
- [使用EventHub進(jìn)行數(shù)據(jù)通信]:在基類Context中提供了EventHub對(duì)象,可以通過(guò)發(fā)布訂閱方式來(lái)實(shí)現(xiàn)事件的傳遞。在事件傳遞前,訂閱者需要先進(jìn)行訂閱,當(dāng)發(fā)布者發(fā)布事件時(shí),訂閱者將接收到事件并進(jìn)行相應(yīng)處理。
- [使用AppStorage/LocalStorage進(jìn)行數(shù)據(jù)同步]:ArkUI提供了AppStorage和LocalStorage兩種應(yīng)用級(jí)別的狀態(tài)管理方案,可用于實(shí)現(xiàn)應(yīng)用級(jí)別和UIAbility級(jí)別的數(shù)據(jù)同步。
- 開發(fā)前請(qǐng)熟悉鴻蒙開發(fā)指導(dǎo)文檔 :[
gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md
]
使用EventHub進(jìn)行數(shù)據(jù)通信
[EventHub]為UIAbility組件提供了事件機(jī)制,使它們能夠進(jìn)行訂閱、取消訂閱和觸發(fā)事件等數(shù)據(jù)通信能力。
在[基類Context]中,提供了EventHub對(duì)象,可用于在UIAbility組件實(shí)例內(nèi)通信。使用EventHub實(shí)現(xiàn)UIAbility與UI之間的數(shù)據(jù)通信需要先獲取EventHub對(duì)象,本章節(jié)將以此為例進(jìn)行說(shuō)明。
- 在UIAbility中調(diào)用[
eventHub.on()
]方法注冊(cè)一個(gè)自定義事件“event1”,[eventHub.on()
]有如下兩種調(diào)用方式,使用其中一種即可。import hilog from '@ohos.hilog'; import UIAbility from '@ohos.app.ability.UIAbility'; import type window from '@ohos.window'; import type { Context } from '@ohos.abilityAccessCtrl'; import Want from '@ohos.app.ability.Want' import type AbilityConstant from '@ohos.app.ability.AbilityConstant'; const DOMAIN_NUMBER: number = 0xFF00; const TAG: string = '[EventAbility]'; export default class EntryAbility extends UIAbility { onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { // 獲取UIAbility實(shí)例的上下文 let context = this.context; // 獲取eventHub let eventhub = this.context.eventHub; // 執(zhí)行訂閱操作 eventhub.on('event1', this.eventFunc); eventhub.on('event1', (data: string) = > { // 觸發(fā)事件,完成相應(yīng)的業(yè)務(wù)操作 }); hilog.info(DOMAIN_NUMBER, TAG, '%{public}s', 'Ability onCreate'); } // ... eventFunc(argOne: Context, argTwo: Context): void { hilog.info(DOMAIN_NUMBER, TAG, '1. ' + `${argOne}, ${argTwo}`); return; } }
- 在UI中通過(guò)[eventHub.emit()]方法觸發(fā)該事件,在觸發(fā)事件的同時(shí),根據(jù)需要傳入參數(shù)信息。
import common from '@ohos.app.ability.common'; import promptAction from '@ohos.promptAction'; @Entry @Component struct Page_EventHub { private context = getContext(this) as common.UIAbilityContext; eventHubFunc() : void { // 不帶參數(shù)觸發(fā)自定義“event1”事件 this.context.eventHub.emit('event1'); // 帶1個(gè)參數(shù)觸發(fā)自定義“event1”事件 this.context.eventHub.emit('event1', 1); // 帶2個(gè)參數(shù)觸發(fā)自定義“event1”事件 this.context.eventHub.emit('event1', 2, 'test'); // 開發(fā)者可以根據(jù)實(shí)際的業(yè)務(wù)場(chǎng)景設(shè)計(jì)事件傳遞的參數(shù) } build() { Column() { // ... List({ initialIndex: 0 }) { ListItem() { Row() { // ... } .onClick(() = > { this.eventHubFunc(); promptAction.showToast({ message: $r('app.string.EventHubFuncA') }); }) } // ... ListItem() { Row() { // ... } .onClick(() = > { this.context.eventHub.off('event1'); promptAction.showToast({ message: $r('app.string.EventHubFuncB') }); }) } // ... } // ... } // ... } }
- 在UIAbility的注冊(cè)事件回調(diào)中可以得到對(duì)應(yīng)的觸發(fā)事件結(jié)果,運(yùn)行日志結(jié)果如下所示。
[Example].[Entry].[EntryAbility] 1. [] [Example].[Entry].[EntryAbility] 1. [1] [Example].[Entry].[EntryAbility] 1. [2,"test"]
- 在自定義事件“event1”使用完成后,可以根據(jù)需要調(diào)用[eventHub.off()]方法取消該事件的訂閱。
// context為UIAbility實(shí)例的AbilityContext this.context.eventHub.off('event1'); `HarmonyOS與OpenHarmony鴻蒙文檔籽料:mau123789是v直接拿`
使用AppStorage/LocalStorage進(jìn)行數(shù)據(jù)同步
ArkUI提供了AppStorage和LocalStorage兩種應(yīng)用級(jí)別的狀態(tài)管理方案,可用于實(shí)現(xiàn)應(yīng)用級(jí)別和UIAbility級(jí)別的數(shù)據(jù)同步。使用這些方案可以方便地管理應(yīng)用狀態(tài),提高應(yīng)用性能和用戶體驗(yàn)。其中,AppStorage是一個(gè)全局的狀態(tài)管理器,適用于多個(gè)UIAbility共享同一狀態(tài)數(shù)據(jù)的情況;而LocalStorage則是一個(gè)局部的狀態(tài)管理器,適用于單個(gè)UIAbility內(nèi)部使用的狀態(tài)數(shù)據(jù)。通過(guò)這兩種方案,開發(fā)者可以更加靈活地控制應(yīng)用狀態(tài),提高應(yīng)用的可維護(hù)性和可擴(kuò)展性。詳細(xì)請(qǐng)參見[應(yīng)用級(jí)變量的狀態(tài)管理]。
審核編輯 黃宇
-
框架
+關(guān)注
關(guān)注
0文章
403瀏覽量
17506 -
數(shù)據(jù)同步
+關(guān)注
關(guān)注
0文章
17瀏覽量
8170 -
鴻蒙
+關(guān)注
關(guān)注
57文章
2362瀏覽量
42884
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論