HarmonyOS 鸿蒙Next NavPathStack如何关闭当前路由,再跳转到下一个路由?
HarmonyOS 鸿蒙Next NavPathStack如何关闭当前路由,再跳转到下一个路由?
没错,我尝试以下这些方式,都无法实现,关闭当前路由再跳转到下一个路由。
以下代码的实际现象是先跳转到下一个路由,过2秒,再返回到前一页。
关于HarmonyOS 鸿蒙Next NavPathStack如何关闭当前路由,再跳转到下一个路由?的问题,您也可以访问:https://www.itying.com/category-93-b0.html 联系官网客服。
找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<string, <span class="hljs-built_in"><span class="hljs-built_in">Object</span></span>>()
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来管理,也就是同一个路由栈,那么是可以实现关闭当前页,再打开其他页面的业务的。
求助:
所以对于以上的实际业务场景,我应该怎么实现呢?
很喜欢HarmonyOS的卡片式设计,信息一目了然,操作也更便捷。
找HarmonyOS工作还需要会Flutter技术的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:https://www.bilibili.com/video/BV1S4411E7LY/?p=17
他是关闭当前路由,不是关闭当前页面。不知道他表达是否准确