文档开发者中心
我的
|

ArkUI (方舟UI框架)

UI

HarmonyOS 5

【ArkUI路由/导航系列】六:Navigation组件的无感监听

上一章 【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)
  }
}

下一章 【ArkUI路由/导航系列】七:Navigation自定义转场动画,让页面切换炫起来


【系列其他文章】

【ArkUI路由/导航系列】一:ArkUI路由原理简介,认识Navigation组件

【ArkUI路由/导航系列】二:Navigation基础路由操作,让页面跳转起来

【ArkUI路由/导航系列】三:NavDestination标题栏和工具栏,丰富页面信息

【ArkUI路由/导航系列】四:Navigation页面信息查询

【ArkUI路由/导航系列】五:Navigation生命周期管理

【ArkUI路由/导航系列】六:Navigation组件的无感监听

【ArkUI路由/导航系列】七:Navigation自定义转场动画,让页面切换炫起来

【ArkUI路由/导航系列】八:Navigation跨包路由,迈入高级路由能力

【ArkUI路由/导航系列】九:Navigation分栏开发,开启多设备开发之旅

【ArkUI路由/导航系列】十:Navigation嵌套开发

【ArkUI路由/导航系列】十一:Navigation弹窗页面开发

【ArkUI路由/导航系列】十二:Navigation路由拦截

点赞
收藏
回复
分享
举报
浏览472 编辑于2025-07-08 06:45广东
全部评论
最多点赞
最新发布
最早发布
暂无评论
暂无评论
写回答
新增插入模板功能
一键使用模板,快速填写内容,轻松发帖~
知道了
  • 为了保障您的信息安全,请勿上传您的敏感个人信息(如您的密码等信息)和您的敏感资产信息(如关键源代码、签名私钥、调试安装包、业务日志等信息),且您需自行承担由此产生的信息泄露等安全风险。
  • 如您发布的内容为转载内容,请注明内容来源。

我要发帖子

目录 收起
【系列其他文章】
了解社区公约,与您携手共创和谐专业的开发者社区。