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事件传递数据时确实存在一些类型限制。根据您的问题和代码,以下是关键点分析:

  1. boolean类型问题:
  • emitter在序列化/反序列化时对boolean类型处理可能存在bug
  • 临时解决方案:将boolean转为number(0/1)或string(‘true’/‘false’)传递
  1. @State修饰的对象问题:
  • @State修饰的响应式对象(mySObj)在序列化时会丢失响应式特性
  • 建议传递普通对象(myObj)而非响应式对象
  • 或者先通过JSON.parse(JSON.stringify())深拷贝后再传递
  1. 推荐改进方式:
// 对于boolean
let eventData3: emitter.GenericEventData<number> = {data: this.myBoolean ? 1 : 0};

// 对于State对象
let eventData4: emitter.GenericEventData<MyObject> = {
  data: JSON.parse(JSON.stringify(this.mySObj))
};
  1. 其他注意事项:
  • 确保传递的数据是可序列化的
  • 复杂对象建议实现toJSON()方法
  • 避免循环引用

这些限制主要是由于emitter的跨线程通信机制需要对数据进行序列化/反序列化导致的。

回到顶部