【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嵌套开发
- 为了保障您的信息安全,请勿上传您的敏感个人信息(如您的密码等信息)和您的敏感资产信息(如关键源代码、签名私钥、调试安装包、业务日志等信息),且您需自行承担由此产生的信息泄露等安全风险。
- 如您发布的内容为转载内容,请注明内容来源。
我要发帖子





































苏公安网备 32011402010933号