HarmonyOS鸿蒙Next中emitter发送的事件数据部分收不到,boolean类型还有加State的对象类型
HarmonyOS鸿蒙Next中emitter发送的事件数据部分收不到,boolean类型还有加State的对象类型
import { AudioRenderFile } from '../component/audioRenderFile';
import { emitter } from '@kit.BasicServicesKit';
class MyObject {
myChar: string
myNumber: number
myBoolean: boolean
constructor(myChar:string, myNumber:number, myBoolean:boolean) {
this.myChar = myChar
this.myNumber = myNumber
this.myBoolean = myBoolean
}
}
@Entry
@Component
struct Index {
@State myChar: string = '123'
@State myNumber: number = 123
@State myBoolean: boolean = false
@State mySObj: MyObject = new MyObject(this.myChar, this.myNumber, this.myBoolean)
myObj: MyObject = new MyObject(this.myChar, this.myNumber, this.myBoolean)
aboutToAppear(): void {
AudioRenderFile.init();
emitter.on('somthing', (eventData) => {
if (eventData && eventData.data) {
console.log('接收到当前屏幕发来的字符', JSON.stringify(eventData.data));
}
})
}
build() {
Column() {
Button('开始').onClick(() => {
console.log('send to ...')
let eventData1: emitter.GenericEventData<string> = {data: this.myChar};
emitter.emit('somthing', eventData1);
let eventData2: emitter.GenericEventData<number> = {data: this.myNumber};
emitter.emit('somthing', eventData2);
let eventData3: emitter.GenericEventData<boolean> = {data: this.myBoolean};
emitter.emit('somthing', eventData3);
let eventData4: emitter.GenericEventData<MyObject> = {data: this.mySObj};
emitter.emit('somthing', eventData4);
let eventData5: emitter.GenericEventData<MyObject> = {data: this.myObj};
emitter.emit('somthing', eventData5);
})
}
.width('100%')
.height('100%')
.justifyContent(FlexAlign.Center)
}
}
更多关于HarmonyOS鸿蒙Next中emitter发送的事件数据部分收不到,boolean类型还有加State的对象类型的实战教程也可以访问 https://www.itying.com/category-93-b0.html
2 回复
在HarmonyOS鸿蒙Next中,emitter发送事件数据部分收不到,可能是由于事件数据类型不匹配或序列化问题。boolean类型和加State的对象类型在事件传递时,需确保数据类型一致且正确序列化。检查事件订阅和发布的类型定义,确保发送和接收的数据类型完全一致。
更多关于HarmonyOS鸿蒙Next中emitter发送的事件数据部分收不到,boolean类型还有加State的对象类型的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS Next中,emitter事件传递数据时确实存在一些类型限制。根据您的问题和代码,以下是关键点分析:
- boolean类型问题:
- emitter在序列化/反序列化时对boolean类型处理可能存在bug
- 临时解决方案:将boolean转为number(0/1)或string(‘true’/‘false’)传递
- @State修饰的对象问题:
- 被@State修饰的响应式对象(mySObj)在序列化时会丢失响应式特性
- 建议传递普通对象(myObj)而非响应式对象
- 或者先通过JSON.parse(JSON.stringify())深拷贝后再传递
- 推荐改进方式:
// 对于boolean
let eventData3: emitter.GenericEventData<number> = {data: this.myBoolean ? 1 : 0};
// 对于State对象
let eventData4: emitter.GenericEventData<MyObject> = {
data: JSON.parse(JSON.stringify(this.mySObj))
};
- 其他注意事项:
- 确保传递的数据是可序列化的
- 复杂对象建议实现toJSON()方法
- 避免循环引用
这些限制主要是由于emitter的跨线程通信机制需要对数据进行序列化/反序列化导致的。