HarmonyOS 鸿蒙Next Navigation 页面出栈时,onShown 不执行

发布于 1周前 作者 phonegap100 来自 鸿蒙OS

HarmonyOS 鸿蒙Next Navigation 页面出栈时,onShown 不执行 我使用 Navigation 和 NavDestination 路由,页面跳转一切都OK,但是我页面出栈时,无法监听页面的展示。

从HomePage 跳转到其他页面, 然后 NavPathStack.pop() 回到 HomePage。onShown() 未执行。 这种情况 我该怎么监听 HomePage 每次的展示?

// MainPage
@Entry({routeName: 'MainPage'})
@Component
struct MainPage {
 build() {
    Navigation(this.entryHapRouter) {
       Row() {
          Stack({ alignContent: Alignment.Bottom }) {
              Tabs({ barPosition: BarPosition.End, controller: this.controller }) {
                  TabContent() {
                        HomePage({pageInfos: this.entryHapRouter, avator: this.avator}).width(MainPageConstants.FULL_PERCET).height(MainPageConstants.FULL_PERCET)
                   }
               }.scrollable(false)
                 .onChange((index) => {
                       this.currentIndex = index;
                 })
           }.width(MainPageConstants.FULL_PERCET)
      }.height(MainPageConstants.FULL_PERCET).padding({ bottom: 10 })
   }.hideTitleBar(true)
}
// HomePage
@Component
export struct HomePage {
 build() {
    NavDestination() {
      SideBarContainer(SideBarContainerType.Overlay) { //侧边栏
        SideBarContainerMe({ isLogin: this.isLogin, showSlide: this.showSlide , avator: this.avator})
        Stack() {
            /****************/
          }.align(Alignment.TopStart)
        .width(HomePageConstants.FULL_WIDTH)
        .height(HomePageConstants.FULL_HEIGHT)
      }
      .showSideBar(this.showSlide)
  }.hideTitleBar(true)
   .onShown(() => {
      //未执行
    })
}
}

更多关于HarmonyOS 鸿蒙Next Navigation 页面出栈时,onShown 不执行的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

可以通过uiObserver.on('navDestinationUpdate', func)来进行监听
文档地址:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-navigation-navigation-V5#页面监听和查询

通过eventHub传递事件
文档地址:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-js-apis-inner-application-eventhub-0000001774280590

示例代码

// Index.ets

eventFunc() {
    console.log('eventFunc is called');
}
aboutToAppear() {
    if (!this.entryHapRouter) {
        this.entryHapRouter = new NavPathStack();
    }
    console.log("====Index=aboutToAppear=")
    let context = getContext() as common.UIAbilityContext;
    context.eventHub.on('myEvent', this.eventFunc);
    RouterModule.createRouter(RouterNameConstants.ENTRY_HAP, this.entryHapRouter);
};
// EntryAbility.ets

windowStage.getMainWindow((err: BusinessError, data) => {
    let windowClass = data;
    let uiContext: UIContext = windowClass.getUIContext();

    let uiObserver: UIObserver = uiContext.getUIObserver();
    uiObserver.on("navDestinationUpdate", (info) => {
        // NavDestinationState.ON_SHOWN = 0, NavDestinationState.ON_HIDE = 1
        if (info.state == 0) {
            // NavDestination组件显示时操作
            console.info('page ON_SHOWN:' + info.name.toString());
            console.info('page ON_SHOW:' + info.navDestinationId.toString());
        } else if (info.state == 1){
            console.info('page ON_HIDDEN:' + info.name.toString());
            console.info('page ON_HIDDEN:' + info.navDestinationId.toString());
            this.context.eventHub.emit('myEvent');
        }
    })
})

更多关于HarmonyOS 鸿蒙Next Navigation 页面出栈时,onShown 不执行的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS(鸿蒙)系统中,当Next Navigation页面出栈时,如果onShown方法没有执行,这通常与页面生命周期管理或事件触发机制有关。onShown方法通常在页面成功显示给用户时被调用,但如果页面在显示过程中被销毁或替换,该方法可能不会触发。

可能的原因包括:

  1. 页面生命周期异常:页面可能在完全显示之前就已经进入了销毁阶段,导致onShown无法执行。检查页面的生命周期管理代码,确保页面在显示过程中没有被异常销毁。

  2. 事件传递问题:如果页面之间的导航事件没有正确传递或处理,可能会影响onShown的触发。确保导航事件被正确处理,并且页面状态更新逻辑正确无误。

  3. 系统或框架bug:在某些情况下,系统或框架本身的bug也可能导致onShown不执行。检查鸿蒙系统的更新日志和已知问题列表,看是否有相关的修复或说明。

解决这类问题通常需要深入调试和检查代码逻辑。确保所有相关的页面生命周期方法和事件处理逻辑都按预期工作。如果问题依旧没法解决请联系官网客服,官网地址是:

https://www.itying.com/category-93-b0.html

回到顶部