HarmonyOS鸿蒙Next中使用uiContext.getRouter().pushUrl在工具类中实现页面跳转失败

HarmonyOS鸿蒙Next中使用uiContext.getRouter().pushUrl在工具类中实现页面跳转失败 我在工具类中使用UIContext.getRouter()去进行页面跳转,结果跳转失败,不知道问题出在哪里。

instance.interceptors.response.use((response: AxiosResponse)=>{

  if(response.data.result =='1'){
    toast.show(response.data.msg)
    const uicontext: UIContext = AppStorage.get('UIcontext') as UIcontext
    uicontext.getRouter().pushUrl({ url: 'pages/userLogin' })
    return Promise.reject(response.data)
  }

  logger.info('succeed'JsoN.stringify(response.data))
  return response.data

},(error:AxiosError)=>{}

UIContext我是在EntryAbility中的生命周期中获取的。

onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    try {
      this.context.getApplicationContext().setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_NOT_SET);
      AppStorage.setOrCreate('UIContext', this.context)
    } catch (err) {
      hilog.error(DOMAIN, 'testTag', 'Failed to set colorMode. Cause: %{public}s', JSON.stringify(err));
    }
    hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onCreate');
  }

更多关于HarmonyOS鸿蒙Next中使用uiContext.getRouter().pushUrl在工具类中实现页面跳转失败的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

问题所在:UIContext获取有问题。

如果直接在EntryAbility中通过this.context方式获取到的,是UIAbilityContext,并非UIContext。即便在工具类中获取的时候通过as的方式让编译器判断为UIContext,但是依旧无法调用getRouter()方法,运行会报错。

正确的获取UIContext的方式应该是:

onWindowStageCreate(windowStage: window.WindowStage): void {

    // Main window is created, set main page for this ability

    hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onWindowStageCreate');

    windowStage.loadContent('pages/Index', (err) => {

        //============================//

        let context = windowStage.getMainWindowSync().getUIContext()

        AppStorage.setOrCreate('UIContext', context)

        //===========================//

        if (err.code) {

            hilog.error(DOMAIN, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err));

            return;

        }

        hilog.info(DOMAIN, 'testTag', 'Succeeded in loading the content.');

    });

}

更多关于HarmonyOS鸿蒙Next中使用uiContext.getRouter().pushUrl在工具类中实现页面跳转失败的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next中,uiContext.getRouter().pushUrl在工具类中跳转失败,通常是因为工具类无法直接获取UI上下文。鸿蒙的UI操作需在主线程或UIAbility上下文中执行。工具类独立于UI组件,无法直接访问UIContext实例。可考虑通过回调方式将UIContext从页面组件传递至工具类,或使用EventHub进行跨组件通信传递路由参数。需确保pushUrl操作在持有有效UIContext的上下文中执行。

在工具类中使用 UIContext.getRouter().pushUrl 跳转失败的主要原因是 UIContext 的生命周期与页面路由不匹配

从代码分析:

  1. 存储的 UIContext 是 Ability 上下文

    AppStorage.setOrCreate('UIContext', this.context)  // this.context 是 Ability 上下文
    

    在 EntryAbility 的 onCreate 中存储的是 Ability 级别的上下文,它不具备页面级的路由能力。

  2. 正确的做法是使用页面级 UIContext

    • 在页面组件中通过 getUIContext() 获取页面级 UIContext
    • 将页面级 UIContext 传递给工具类使用

修改建议

在页面组件中:

@Entry
@Component
struct Index {
  private uiContext: UIContext = getUIContext()

  onPageShow() {
    // 将页面级 UIContext 存入 AppStorage 或直接传递给工具类
    AppStorage.setOrCreate('UIcontext', this.uiContext)
  }
}

在工具类中确保使用页面级 UIContext 进行跳转:

const uicontext: UIContext = AppStorage.get('UIcontext') as UIContext
uicontext.getRouter().pushUrl({ url: 'pages/userLogin' })

关键点:Ability 上下文的 UIContext 主要用于应用级操作,页面跳转必须使用页面级的 UIContext。

回到顶部