使用 EventHub 進行數據通信
Stage模型概念圖
根據 Stage 模型概念圖 UIAbility
先于 ArkUI Page
創建
所以,事件要先 .on
訂閱 再 emit
發布
假如現在有頁面 Page1 和他的 UIAbility
// src/main/ets/page1ability/Page1Ability.ets
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {//通過EventHub對象在UIAbility和它加載的某個頁面間共享數據let ctx = this.contextlet hub = ctx.eventHub //事件集中器對象//UIAbility監聽事件集市中的事件,讀取攜帶的數據hub.on('OnPage1Ability', (data:string)=>{console.log('--UIAbility監聽到頁面發布的事件,其中傳來數據:', JSON.stringify(data))})}
// src/main/ets/pages/Page1.ets
@Entry
@Component
struct Page1 {@State message: string = 'Page1';build() {Button('在事件集中器對象中發射一個事件').onClick(_=>{let ctx = getContext()let hub = ctx.eventHub //事件集中器對象//頁面發布一個事件,并攜帶數據hub.emit('OnPage1Ability','Page1_Send_Msg')})}
}
先在 UIAbility 訂閱 on ,再在 Page1 發布事件 emit,不要反過來,不然 UIAbility 事件發布后 UI 頁面還沒生成,拿什么訂閱
使用 AppStorage 進行數據同步
應用級別的數據同步
在 HarmonyOS 應用中,最快初始化或使用 AppStorage 的位置通常是應用的入口組件(@Entry 裝飾的組件),或是通過單獨的狀態管理文件集中聲明全局狀態。
假如我現在隨便找個 UIAbility 加它的 UI 來舉例吧
忘了,介紹 2 個裝飾器先
以下是 AppStorage 的應用全局 UI 狀態存儲裝飾器對比表格,基于 HarmonyOS 官方文檔梳理:
特性 | @StorageProp | @StorageLink |
---|---|---|
裝飾器參數 | key: string (常量字符串,必填) | key: string (常量字符串,必填) |
同步類型 | 單向(AppStorage→ 組件) | 雙向(AppStorage? 組件) |
數據流方向 | AppStorage 的值覆蓋組件本地值 | 組件修改同步回 AppStorage,AppStorage 變更同步到所有綁定組件 |
允許的數據類型 | 基礎類型、對象、數組(不支持 any、undefined/null) | 與@StorageProp 相同 |
初始值要求 | 必須指定,若 AppStorage 無對應屬性則創建并存儲 | 必須指定,規則同@StorageProp |
本地修改行為 | 允許本地修改,但會被 AppStorage 更新覆蓋 | 本地修改直接觸發 AppStorage 全局更新 |
適用場景 | 全局只讀配置(如主題色、語言)、設備信息 | 需雙向交互的狀態(如用戶登錄態、購物車商品數) |
// src/main/ets/page1ability/Page1Ability.ets
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {AppStorage.setOrCreate('cartCount', 99)AppStorage.setOrCreate('themeColor', '#ff13c613') // 確保全局存在}
// src/main/ets/pages/Page1.ets
import { common } from '@kit.AbilityKit'
@Entry
@Component
struct Page1 {@State message: string = 'Page1';@StorageProp('themeColor') color: string = '#ff13c613' // 全局主題色@StorageLink('cartCount') count: number = 0 // 購物車商品數build() {Column({space:10}) {Text('當前主題色').fontColor(this.color)Button(`商品數量:${this.count}`).onClick(() => this.count++) // 可以修改}}
}
使用 LocalStorage 進行數據同步
UIAbility 級別的數據同步
介紹 2 個裝飾器先
對比項 | @LocalStorageProp | @LocalStorageLink |
---|---|---|
同步方向 | 單向(LocalStorage→ 組件) | 雙向(LocalStorage? 組件) |
初始值要求 | 必須指定,用于初始化 LocalStorage 屬性(若不存在) | 同左 |
本地修改影響 | 本地修改不觸發回傳,會被 AppStorage 更新覆蓋 | 本地修改自動同步至 LocalStorage,觸發全局刷新 |
適用場景 | 只讀全局配置(如主題色、語言) | 動態交互狀態(如用戶輸入、表單數據) |
例子不寫了,看官網吧
關閉窗口
import { common } from '@kit.AbilityKit'@Entry
@Component
struct Page1 {@State message: string = 'Page1';build() {Column({space:10}) {Text(this.message).fontSize(30)Button('關閉當前窗口').onClick(_=>{let ctx = getContext( ) as common.UIAbilityContext //得到頁面所在UIAbility對應的UIAbilityContextctx.terminateSelf()})Button('關閉當前應用的所有窗口,即退出程序').onClick(_=>{let ctx = getContext( ) as common.UIAbilityContextlet appCtx = ctx.getApplicationContext()appCtx.killAllProcesses()})}}
}