HarmonyOS 鸿蒙Next emitter data丢失

发布于 1周前 作者 htzhanglong 来自 鸿蒙OS

HarmonyOS 鸿蒙Next emitter data丢失

emitter data丢失

2 回复

目前发送事件时传递的数据,eventdata支持数据类型包括Array、ArrayBuffer、Boolean、DataView、Date、Error、Map、Number、Object、Primitive(除了symbol)、RegExp、Set、String、TypedArray

参考地址:https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-emitter#emitteron

//Index.ets

import { ChildComponent, Person } from './ChildComponent'

import { emitter } from '@kit.BasicServicesKit';

@Entry

@Component

struct Index {

  aboutToAppear(): void {

    emitter.on({

      eventId: 666,

      priority: emitter.EventPriority.IMMEDIATE

    }, (eventData: emitter.EventData) => {

      let data = eventData?.data

      if (data) {

        let person: Person = data['key'] as Person

        console.log('result private person obj name =>',person?.name)

      }else {

        console.log('result private person => data为空')

      }

    })

  }

  build() {

    Stack({

      alignContent: Alignment.Center

    }) {

      Button('按钮', { type: ButtonType.Normal })

        .size({ width: '90%', height: '90%' })

        .onClick(() => {

          console.info('wendyLog orange button clicked')

        })

        .backgroundColor(Color.Orange)

      ChildComponent()

    }

    .height('100%')

    .width('100%')

    .backgroundColor(Color.Gray)

  }

}

//ChildComponent.ets

import { emitter } from '@kit.BasicServicesKit';

export class Person {

  name?:string;

  age?:number;

  constructor(name?:string, age?:number) {

    this.name = name

    this.age = age

  }

}

@Component

export struct ChildComponent {

  private privatePerson:Person = new Person('小张', 18)

  build() {

    Column(){

      Button('emitter发送数据', { type: ButtonType.Normal })

        .size({ width: '90%', height: 40 })

        .onClick(() => {

          emitter.emit(

            {

              eventId: 666,

              priority: emitter.EventPriority.IMMEDIATE

            },

            {

              data:new Object({'key':this.privatePerson})

            })

        })

        .backgroundColor(Color.Green)

    }

    .size({width:'80%',height:'80%'})

    .backgroundColor(Color.Yellow)

    .justifyContent(FlexAlign.Center)

  }

}

//ChildComponent.ets

import { emitter } from '@kit.BasicServicesKit';

export class Person {

  name?:string;

  age?:number;

  constructor(name?:string, age?:number) {

    this.name = name

    this.age = age

  }

}

@Component

export struct ChildComponent {

  private privatePerson:Person = new Person('小张', 18)

  build() {

    Column(){

      Button('emitter发送数据', { type: ButtonType.Normal })

        .size({ width: '90%', height: 40 })

        .onClick(() => {

          emitter.emit(

            {

              eventId: 666,

              priority: emitter.EventPriority.IMMEDIATE

            },

            {

              data:new Object({'key':this.privatePerson})

            })

        })

        .backgroundColor(Color.Green)

    }

    .size({width:'80%',height:'80%'})

    .backgroundColor(Color.Yellow)

    .justifyContent(FlexAlign.Center)

  }

}

针对HarmonyOS 鸿蒙Next中emitter data丢失的问题,这通常是由于在数据分发过程中,实体对象被不当地转换或处理导致的。以下是一些可能的原因及解释:

  1. 数据序列化与反序列化:在emitter分发过程中,源对象可能被序列化为JSON格式,随后在接收端反序列化。这一过程可能导致源对象的类型信息和自有方法丢失,接收到的仅为普通Object类型。
  2. 类型安全问题:鸿蒙Next的emitter机制在分发对象时,若未正确处理泛型信息,可能导致类型不匹配,进而造成数据丢失或类型错误。

为解决这一问题,建议检查emitter的API调用方式,确保在分发和接收数据时正确使用了泛型。同时,鸿蒙Next的开发团队也可能需要对此进行优化,以避免在分发过程中对对象进行不必要的序列化。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部