HarmonyOS 最近的更新是否导致了Provide修饰的数据是否无法emit?

在使用@Provide修饰的变量进行emiit操作的时候,订阅方收到的数据为空。发送方和订阅方都是通过@Component修饰的页面,发送的数据使用provide修饰的数据。

示例代码如下:

@Entry
@Component
export struct BaseScanPage{
  @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在接收处接收不到数据。

阅读 584
1 个回答

发送的@Provide修饰的变量可以被接收,示例参考如下:

import { BusinessError, emitter } from '@kit.BasicServicesKit';
import { router } from '@kit.ArkUI';

@Entry
@Component
export struct BaseScanPage {
  @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