HarmonyOS 鸿蒙Next NavPathStack如何关闭当前路由,再跳转到下一个路由?

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

HarmonyOS 鸿蒙Next NavPathStack如何关闭当前路由,再跳转到下一个路由?

没错,我尝试以下这些方式,都无法实现,关闭当前路由再跳转到下一个路由。

以下代码的实际现象是先跳转到下一个路由,过2秒,再返回到前一页。

cke_131.png



关于HarmonyOS 鸿蒙Next NavPathStack如何关闭当前路由,再跳转到下一个路由?的问题,您也可以访问:https://www.itying.com/category-93-b0.html 联系官网客服。

7 回复

找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:https://www.bilibili.com/video/BV1S4411E7LY/?p=17

我在补充下现在的测试情况

实际业务场景:

登录成功后,关闭登录页,跳转到首页。我们首页全部都是小程序,使用的mPaaS小程序容器加载。它应该是自己维护的一个路由栈进行跳转,实现代码如下:

[@Component](/user/Component)
struct PageMini {
  private context = getContext(this) as common.UIAbilityContext;
  [@Provide](/user/Provide)('pageInfos') pageInfos: NavPathStack = new NavPathStack()

openMain() { try { let startParams = new Map<string, Object>() startParams.set(“query”, “aa=bb”) HRiverMini.startApp(“0000000111111101”, startParams) console.info(Constants.TAG, ‘openIndex’, ‘succ’) } catch (e) { console.error(Constants.TAG, ‘openIndex’, JSON.stringify(e)) } }

@Builder PageMap(name: string, navPageIntent: Map<string, Object>) { AppPage(name, navPageIntent); }

aboutToAppear(): void { HRiverMini.notifyNavigationCreate(this.context, this.pageInfos) }

build() { Navigation(this.pageInfos) { Column() { Button(“远程小程序”) .fontSize(16) .margin({ top: 50 }) .fontWeight(FontWeight.Bold) .width(‘80%’) .onClick(event => { this.openMain() }) }.navDestination(this.PageMap); }<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>

而我们的登录页则是我自己维护的路由栈,所以当跳转到以上代码中时,我需要在哎build()中增加NavDestination(),并且在openMain()中,执行打开小程序代码之前,先关闭当前的路由。所以代码调整如下:

@Component
struct PageMini {
private context = getContext(this) as common.UIAbilityContext;
@Provide(‘pageInfos’) pageInfos: NavPathStack = new NavPathStack()

openMain() { try { //关闭当前页 RouterManager.pop1(false)

  <span class="hljs-keyword"><span class="hljs-keyword">let</span></span> startParams = <span class="hljs-keyword"><span class="hljs-keyword">new</span></span> Map&lt;string, <span class="hljs-built_in"><span class="hljs-built_in">Object</span></span>&gt;()
  startParams.set(<span class="hljs-string"><span class="hljs-string">"query"</span></span>, <span class="hljs-string"><span class="hljs-string">"aa=bb"</span></span>)
  HRiverMini.startApp(<span class="hljs-string"><span class="hljs-string">"0000000111111101"</span></span>, startParams)
  console.info(Constants.TAG, <span class="hljs-string"><span class="hljs-string">'openIndex'</span></span>, <span class="hljs-string"><span class="hljs-string">'succ'</span></span>)
} <span class="hljs-keyword"><span class="hljs-keyword">catch</span></span> (e) {
  console.error(Constants.TAG, <span class="hljs-string"><span class="hljs-string">'openIndex'</span></span>, <span class="hljs-built_in"><span class="hljs-built_in">JSON</span></span>.stringify(e))
}

}

@Builder PageMap(name: string, navPageIntent: Map<string, Object>) { AppPage(name, navPageIntent); }

aboutToAppear(): void { HRiverMini.notifyNavigationCreate(this.context, this.pageInfos) }

build() { NavDestination() { Navigation(this.pageInfos) { Column() { Button(“远程小程序”) .fontSize(16) .margin({ top: 50 }) .fontWeight(FontWeight.Bold) .width(‘80%’) .onClick(event => { this.openMain() }) }.navDestination(this.PageMap); } .hideTitleBar(true) }

<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>

以上的RouterManager是我自己封装的路由类,如下:

import { Constants } from ‘./Constants’

class RouterManager { pageNavPathStack: NavPathStack | null = null

createNavPathStackByPage(n1: NavPathStack) { this.pageNavPathStack = n1 }

//跳转页面 pushPath(info: NavPathInfo, animated?: boolean) { this.pageNavPathStack?.pushPath(info, animated) }

pop1(animated?: boolean): NavPathInfo | undefined { return this.pageNavPathStack?.pop(animated) }

//返回 pop(result: Object, animated?: boolean): NavPathInfo | undefined { return this.pageNavPathStack?.pop(result, animated) }

//移除某个router by name removeByName(name: string) { this.pageNavPathStack?.removeByName(name) }

//移除某个router by name clear(animated?: boolean) { this.pageNavPathStack?.clear(animated) } }

export default new RouterManager()<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>

引发的问题:

无法实现关闭登录页,再跳转小程序的业务。可能是因为登录页和小程序都是各自维护的路由栈,导致无法实现?为何这么说呢?为了验证这种猜想,我又去测试了一种情况。

因为小程序单独维护的一个路由栈,我所以我又复制了一个RouterManeger,类名叫Router007Manger。这样就可以实现用两个路由栈来管理两个页面,并测试,果然发现,跟打开小程序的效果是一样的。

其他测试:

如果我全部页面都用RouterManager或者Router007Manager来管理,也就是同一个路由栈,那么是可以实现关闭当前页,再打开其他页面的业务的。

求助:

所以对于以上的实际业务场景,我应该怎么实现呢?

使用 router 不行吗

很喜欢HarmonyOS的卡片式设计,信息一目了然,操作也更便捷。

找HarmonyOS工作还需要会Flutter技术的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:https://www.bilibili.com/video/BV1S4411E7LY/?p=17

replaceByName 不行么

他是关闭当前路由,不是关闭当前页面。不知道他表达是否准确

回到顶部