HarmonyOS 鸿蒙Next ArkUI路由/导航系列:Navigation组件的无感监听

HarmonyOS 鸿蒙Next ArkUI路由/导航系列:Navigation组件的无感监听 无感监听功能可以对NavDestination页面的行为状态进行监听,当该行为发生时会触发开发者注册的无感监听回调。例如,通过如下代码开启navigation路由框架的两种监听:

// ObserverNavigation.ets

import { uiObserver } from "@kit.ArkUI"

@Component
struct ObserverNavigation {
  stack: NavPathStack = new NavPathStack()
  // 回调函数,当navDestinationUpdate发生时会回调该函数
  onNavDestinationUpdate(info: uiObserver.NavDestinationInfo): void {
    console.log('AceNavigation', 'navDestinationUpdate')
  }
  // 回调函数,当onNavDestinationSwitch发生时会回调该函数
  onNavDestinationSwitch(info: uiObserver.NavDestinationSwitchInfo): void {
    console.log('AceNavigation', 'navDestinationSwitch')
  }
  // 在Navigation所在的自定义组件aboutToAppear中,注册无感监听
  aboutToAppear(): void {
    // 注册navDestinationUpdate监听,当任意navDestination页面的状态发生更新时,例如创建、显示时触发该回调
    this.getUIContext().getUIObserver().on('navDestinationUpdate', this.onNavDestinationUpdate)
    // 注册navDestinationSwitch监听,当发生navDestination页面切换的行为时触发该回调
    this.getUIContext().getUIObserver().on('navDestinationSwitch', this.onNavDestinationSwitch)
    // 跳转到页面pageOne
    this.stack.pushPath({name: 'observerPageOne'})
  }

  build() {
    Navigation(this.stack) {}
    .id('ObserverNavigation')
    .hideNavBar(true)
  }
}

上面这个例子会对当前实例中所有的navigation进行监听。如果仅希望对某个指定的navigation进行监听,开发者可以通过指定navigationId来实现,例如:

// 在Navigation自定义组件的aboutToAppear中开启监听
aboutToAppear(): void {
  // 注册navDestinationUpdate监听,当id为`ObserverNavigation`的navigation内部的navDestination页面的状态发生更新时,例如创建、显示时触发该回调
  this.getUIContext().getUIObserver().on('navDestinationUpdate', { navigationId: 'ObserverNavigation' }, this.onNavDestinationUpdate)
  // 注册navDestinationSwitch监听,当id为`ObserverNavigation`的navigation发生navDestination页面切换的行为时触发该回调
  this.getUIContext().getUIObserver().on('navDestinationSwitch', { navigationId: 'ObserverNavigation' }, this.onNavDestinationSwitch)
}

无感监听也可以取消。类似于开启的过程,开发者可以通过指定navigationId来取消某个navigation上的监听,也可以取消当前实例中所有的监听,例如:

// 在Navigation自定义组件的aboutToDisappear中注销监听
aboutToDisappear(): void {
  // 为id为ObserverNavigation的navigation注销navDestinationUpdate监听,范围为所有绑定了this.onNavDestinationSwitch回调函数的监听器
  this.getUIContext().getUIObserver().off('navDestinationUpdate', { navigationId: 'ObserverNavigation' }, this.onNavDestinationUpdate)
  // 注销navDestinationSwitch监听,范围为所有绑定了this.onNavDestinationSwitch回调函数的监听器
  this.getUIContext().getUIObserver().off('navDestinationSwitch', this.onNavDestinationSwitch)
  // 注销navDestinationSwitch监听,范围当前实例中所有的navDestinationSwitch监听器
  this.getUIContext().getUIObserver().off('navDestinationSwitch')
}

对于开发者而言,页面生命周期中往往会有固定的代码逻辑。例如在每个页面onShown中将自己的信息上报,或者在页面创建出来时将自己上报。对于这样通用的、每个页面都需要增加的逻辑,开发者可以使用无感监听uiObserver进行优化。例如如下的代码,在Navigation中开启对页面onAppear的监听,当页面创建时,会弹出弹窗’当前创建页面: xxx’:

// ObserverNavigation.ets

@Component
struct ObserverNavigation {
  stack: NavPathStack = new NavPathStack()

  // 回调函数,当navDestinationUpdate发生时会回调该函数
  onNavDestinationUpdate(info: uiObserver.NavDestinationInfo): void {
    console.log('AceNavigation', 'navDestinationUpdate')
    // 当页面onAppear时,记录它的name属性
    if (info.state === uiObserver.NavDestinationState.ON_APPEAR) {
      promptAction.openToast({message: '当前创建页面: ' + info.name.toString()})
    }
  }

  aboutToAppear(): void {
    // 注册navDestinationUpdate监听,当id为`ObserverNavigation`的navigation内部的navDestination页面的状态发生更新时,例如创建、显示时触发该回调
    this.getUIContext().getUIObserver().on('navDestinationUpdate', { navigationId: 'ObserverNavigation' }, this.onNavDestinationUpdate)
    // 跳转到页面pageOne
    this.stack.pushPath({name: 'observerPageOne'})
  }
  
  build() {
    Navigation(this.stack) {}

    .id('ObserverNavigation')
    .hideNavBar(true)
  }
}

(未完待续……)


更多关于HarmonyOS 鸿蒙Next ArkUI路由/导航系列:Navigation组件的无感监听的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

在HarmonyOS Next中,Navigation组件可通过页面路由观察者(router.UIObserver)实现无感监听。开发者注册观察者后,可监听页面栈变化(push/pop/replace等操作),无需主动调用API。具体使用router.UIObserver.on()方法订阅路由事件,通过off()取消监听。该机制基于ArkUI的声明式UI特性,监听逻辑与UI更新自动同步,适用于需要响应路由变化但不介入具体导航操作的场景。

更多关于HarmonyOS 鸿蒙Next ArkUI路由/导航系列:Navigation组件的无感监听的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next中,Navigation组件的无感监听功能确实为开发者提供了更灵活的页面状态管理方式。通过uiObserver可以优雅地实现以下功能:

  1. 监听类型:
  • navDestinationUpdate:监听页面状态变化(创建/显示等)
  • navDestinationSwitch:监听页面切换事件
  1. 监听范围控制:
  • 全局监听:不指定navigationId时监听所有Navigation实例
  • 精准监听:通过navigationId指定具体Navigation实例
  1. 典型应用场景:
  • 统一埋点:在onAppear时自动上报页面访问数据
  • 状态同步:监听页面切换实现跨页面状态管理
  • 性能监控:记录页面创建/显示耗时
  1. 注意事项:
  • 务必在aboutToDisappear中取消监听避免内存泄漏
  • 回调函数中避免耗时操作影响页面切换性能
  • 对于简单场景,优先考虑使用页面生命周期回调

这种设计既保持了组件化的灵活性,又通过统一监听机制减少了重复代码,是ArkUI框架中值得关注的特性。

回到顶部