HarmonyOS 鸿蒙Next路由跳转2次后emitter.on监听失效

HarmonyOS 鸿蒙Next路由跳转2次后emitter.on监听失效 A界面使用了emitter.on监听,会触发事件event1, 点击组件跳转到B界面,操作触发了emitter,此时会触发event1

当返回A界面后,继续跳转B界面,操作触发了emitter,A界面的emitter.on监听失效,无法触发event1

6 回复

使用Navigation + 系统路由表方式进行路由跳转,多次跳转返回后没有出现失效问题,测试代码如下:

页面A代码:

import { ToastUtil } from '@pura/harmony-utils';
import { NavUtil } from '../../../../common/NavUtil';
import { emitterSend, emitterSub } from '../../../../common/util/EmitterUtil';

@Entry
@Component
struct NavPage {
  @State message: string = 'NavPage';

  aboutToAppear(): void {
    emitterSub(1, () => {
      ToastUtil.showToast("触发event1")
    })
  }

  build() {
    Navigation(NavUtil.pageInfos) {
      Text(this.message)
        .fontSize(50)
        .fontWeight(FontWeight.Bold)
      Button("event1事件触发")
        .onClick(() => {
          emitterSend(1, "1234")
        })
      Button("跳转PageOne")
        .onClick(() => {
          NavUtil.pageInfos.pushPath({
            name: "PageOne"
          })
        })
    }
    .hideTitleBar(true)
    .hideBackButton(true)
    .hideToolBar(true)
  }
}

页面B代码

import { NavUtil } from '../../../../../common/NavUtil';
import { emitterSend } from '../../../../../common/util/EmitterUtil';

@Component
struct PageOne {
  @State message: string = 'PageOne';

  build() {
    NavDestination() {
      Text(this.message)
        .id('NavPageHelloWorld')
        .fontSize(50)
        .fontWeight(FontWeight.Bold)
      Button("event1事件触发")
        .onClick(() => {
          emitterSend(1, "1234")
        })
    }
    .onBackPressed(() => {
      NavUtil.pageInfos.pop() // 弹出路由栈栈顶元素
      return true
    })
  }
}

@Builder
export function PageOneBuilder() {
  PageOne()
}

EmitterUtil

import emitter from '@ohos.events.emitter';
import { Callback } from '@ohos.base';

export function emitterSub(eventId: number, eventCallback: Callback<emitter.EventData>) {
  let event: emitter.InnerEvent = {
    eventId: eventId
  }
  emitter.on(event, eventCallback)
}

export function emitterSend(eventId: number, eventParam: string) {
  let event: emitter.InnerEvent = {
    eventId: eventId
  }

  let eventData: emitter.EventData = {
    data: {
      param: eventParam
    }
  };
  emitter.emit(event, eventData)
}

NavUtil

export class NavUtil {
  static pageInfos: NavPathStack = new NavPathStack()
}

更多关于HarmonyOS 鸿蒙Next路由跳转2次后emitter.on监听失效的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


调用emiter.off(event1)后,event1的emitter.on监听就会被取消;这种就不是路由跳转导致emiter事件监听失效。

是的, emiter.off(event1, this.callback) 指定callback就行了,这样只会取消对应的callback,

或者,A页面使用emitter.on监听,从A页面,跳转B页面,再返回A页面, 再跳转B页面,此时,A页面的emitter.on监听也会失效。

多次跳转返回就失效

问题已经解决,是因为emitter.off(event) 会把所有界面的event事件取消监听, 可以使用emitter.off(event, this.callback)指定对应的callback, 只会取消对应的callback,

在HarmonyOS中,emitter.on用于监听事件,路由跳转后监听失效可能是由于页面生命周期管理或事件管理器的作用域问题导致的。鸿蒙Next的路由机制可能会导致页面实例被销毁或重建,从而使得之前注册的事件监听器失效。确保在页面重新加载或重新进入时重新注册事件监听器,或者在全局作用域中管理事件监听器,以避免此类问题。

回到顶部