HarmonyOS 鸿蒙Next Provide修饰的数据是否无法emit

发布于 1周前 作者 songsunli 最后一次编辑是 5天前 来自 鸿蒙OS

HarmonyOS 鸿蒙Next Provide修饰的数据是否无法emit

在使用@Provide修饰的变量进行emiit操作的时候发现订阅方收到的数据为空

发送方和订阅方都是通过@Component修饰的页面,发送的数据使用provide修饰的数据 示例代码大概如下所示,有删减,需要调整使用

[@Entry](/user/Entry)
[@Component](/user/Component)
export struct BaseScanPage{
[@Provide](/user/Provide) testResult:Array<string> = ["2333333"]

aboutToAppear() {
FMEmitter.onScanResult((result)=>{
console.log(JSON.stringify(result))
})
}

onResult(){
FMEmitter.emitScanResult(this.testResult)
}
}

/**
* 订阅 - 扫码回调
*/
onScanResult(callback: FMEmitterCallback<emitter.EventData>) {
this.on(scanSuccessBack, callback)
}

offScanResult() {
emitter.off(scanSuccessBack.eventId)
}

/**
* 发送 - 扫码成功回调
*/
emitScanResult(result?: Array<string>) {
let eventData: emitter.EventData = {
data: {
"result": result
}
}
this.emit(scanSuccessBack, eventData)
}

export const scanSuccessBack: emitter.InnerEvent = {
eventId: 72
}

调用onResult在接收处接收不到数据


更多关于HarmonyOS 鸿蒙Next Provide修饰的数据是否无法emit的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

发送的@Provide修饰的变量可以被接收,可以参考demo:

import { BusinessError, emitter } from '@kit.BasicServicesKit';
import { router } from '@kit.ArkUI';
@Entry
@Component
export struct BaseScanPage{
  [@Provide](/user/Provide) testResult:Array<string> = ["2333333"]
  build() {
    Column()
    {
      Button('发送')
        .onClick(()=>{
          this.emitScanResult(this.testResult)
        })
      Button('跳转').onClick(()=>{
        try {
          router.pushUrl({
            url: 'pages/Index30',
          })
        } catch (err) {
          console.error(`pushUrl failed, code is ${(err as BusinessError).code}, message is ${(err as BusinessError).message}`);
        }
      })
    }
  }
  /**
   * 发送 - 扫码成功回调
   */
  emitScanResult(result?: Array<string>) {
    let event: emitter.InnerEvent = {
      eventId: 1,
      priority: emitter.EventPriority.LOW
    };
    let eventData: emitter.EventData = {
      data: {
        "result": result
      }
    };
    // 发送eventId为1的事件,事件内容为eventData
    emitter.emit(event, eventData);
  }
}
import { emitter } from '@kit.BasicServicesKit';
import { promptAction } from '@kit.ArkUI';
import { hilog } from '@kit.PerformanceAnalysisKit';
const TAG: string = 'ThreadModel';
const DOMAIN_NUMBER: number = 0xFF00;
@Entry
@Component
export struct Index30{
  aboutToAppear() {
    // 定义一个eventId为1的事件
    let event: emitter.InnerEvent = {
      eventId: 1
    };
    // 收到eventId为1的事件后执行该回调
    let callback = (eventData: emitter.EventData): void => {
      promptAction.showToast({
        message: JSON.stringify(eventData)
      });
      console.log('1111:::',JSON.stringify(eventData))
      hilog.info(DOMAIN_NUMBER, TAG, 'event callback:' + JSON.stringify(eventData));
    };
    // 订阅eventId为1的事件
    emitter.on(event, callback);
    promptAction.showToast({
      message: JSON.stringify('emitter subscribe success')
    });
  }
  build() {
    Column()
    {
      Button('接收')
        .onClick(()=>{
        })
    }
  }
}

参考文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/itc-with-emitter-V5

更多关于HarmonyOS 鸿蒙Next Provide修饰的数据是否无法emit的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙系统中,Provide修饰的数据并非无法emitProvide主要用于定义跨模块通信中的提供方数据,而emit通常与事件或数据流相关。在鸿蒙的分布式系统中,模块间通信机制包括数据提供与订阅、服务发布与发现等。

Provide装饰的数据可以通过特定的接口或API进行更新和发布,使得订阅这些数据的其他模块能够实时获取到最新的数据状态。这种机制确保了数据的一致性和实时性,但并不直接等同于事件驱动的emit操作。

如果需要在鸿蒙系统中实现类似emit的功能,可以考虑使用事件通道或数据管道等机制来传递数据或事件。这些机制允许模块间异步传递数据或事件,从而实现更复杂的交互逻辑。

总之,Provide修饰的数据在鸿蒙系统中是可以被更新和发布的,但需要通过系统提供的通信机制来实现,而不是直接使用emit这样的操作。

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

回到顶部