引言
鴻蒙提供提供了在同一進(jìn)程不同線程間骤素,或同一進(jìn)程同一線程內(nèi),發(fā)送和處理事件的能力异剥,包括持續(xù)訂閱事件瑟由、單次訂閱事件、取消訂閱事件冤寿,以及發(fā)送事件到事件隊(duì)列的能力歹苦。 @ohos.events.emitter
Emitter
封裝前使用:emitter青伤,下面我們先來看看官方示例:
對(duì)于事件通知,我們主要看兩個(gè)交互操作:
- 發(fā)送
// 事件傳遞的消息體
let eventData: emitter.EventData = {
data: {
"content": "c",
"id": 1,
}
};
let innerEvent: emitter.InnerEvent = {
eventId: 1, //事件的唯一標(biāo)識(shí)殴瘦,后續(xù)監(jiān)聽也是通過這個(gè)唯一值
priority: emitter.EventPriority.HIGH //事件被發(fā)送的優(yōu)先級(jí)
};
emitter.emit(innerEvent, eventData);
- 監(jiān)聽
let innerEvent: emitter.InnerEvent = {
eventId: 1 //和發(fā)送的唯一標(biāo)識(shí)對(duì)應(yīng)上
};
// 收到eventId為1的事件后執(zhí)行回調(diào)函數(shù)
emitter.on(innerEvent, (eventData) => {
// eventData.data 即為上面發(fā)送的消息提
});
不足之處:emitter 發(fā)送和接收消息體類型為 [key: string]: any狠角,而習(xí)慣的強(qiáng)類型語言開發(fā)應(yīng)用的同學(xué)都更傾向于發(fā)送一個(gè)對(duì)象,監(jiān)聽時(shí)接到的也是一個(gè)對(duì)象蚪腋。
EventBus
我們先來看看封裝后 EventBus 的使用區(qū)別:
- 首先定義一個(gè)對(duì)象丰歌,用來測(cè)試我們事件的發(fā)送和監(jiān)聽
// test: eventBus 發(fā)送和接收的數(shù)據(jù)模型
interface TestEventModule {
name: string,
age: number,
}
- 發(fā)送事件,傳遞一個(gè)對(duì)象
let eventData: TestEventModule = {
name: '李小轟',
age: 123
}
EventBus.send('TestEventID', eventData)
- 監(jiān)聽事件屉凯,回執(zhí)是一個(gè)對(duì)象
EventBus.listen<TestEventModule>('TestEventID', (data) => {
if (data !== undefined) {
this.receivedData = JSON.stringify(data)
}
})
EventBus.listen<T>
方法提供注入對(duì)象泛型立帖,將監(jiān)聽到的消息體轉(zhuǎn)換成對(duì)應(yīng)類型,如下截圖為悠砚,監(jiān)聽結(jié)果時(shí)的斷點(diǎn):
image.png
附上完整代碼(已開源晓勇,后續(xù)不斷完善)
import { emitter } from '@kit.BasicServicesKit';
/// 事件通知工具類
export abstract class EventBus {
static send(
eventID: string,
eventData?: Object | Record<string, Object> | null,
) {
let data: string | undefined
if (eventData !== null && eventData !== undefined) {
if (typeof eventData === 'string') {
data = eventData
} else {
data = JSON.stringify(eventData)
}
}
emitter.emit(
eventID,
{
priority: emitter.EventPriority.HIGH
},
{
data: {
'data': data
}
},
);
}
static listen<T>(
eventID: string,
callback: (data?: T) => void,
) {
emitter.on(
eventID,
(eventData: emitter.EventData) => {
let data: string | undefined = eventData.data!['data']
if (data == undefined) {
callback(undefined)
} else {
if (data.startsWith("{") && data.endsWith("}")) {
callback(JSON.parse(data) as T)
} else {
callback(data as T)
}
}
},
);
}
static cancel(eventID: string) {
emitter.off(eventID);
}
}
附注(Example)
Demo示例(基于API11開發(fā),支持NEXT及以上版本運(yùn)行)已上傳可供參考灌旧,包含如下內(nèi)容:
- 靜態(tài)庫+多模塊設(shè)計(jì)
- 狀態(tài)管理+統(tǒng)一路由管理
- 網(wǎng)絡(luò)請(qǐng)求宵蕉、Loading、Log(支持長(zhǎng)文本打咏诎瘛) 等工具庫封裝
- 自定義組件羡玛、自定義彈窗(解耦)
- EventBus 事件通知