HarmonyOS 鸿蒙Next中如何解决主窗口页面跳转失败的问题
HarmonyOS 鸿蒙Next中如何解决主窗口页面跳转失败的问题
【问题现象】
在有使用子窗口创建的悬浮窗情况下,点击主窗口中的组件,弹出系统权限弹窗,选择仅本次使用期间,正常是会在主页面进行路由跳转到下一个页面,但是目前新页面会在悬浮窗中打开。如果没有出现系统权限弹窗,则是正常在主窗口中打开。
预期效果: 点击“获取定位”-“仅本次使用期间”跳转到下一页面。
实际效果: 点击跳转后,主页面未发生改变,跳转页面在悬浮窗中体现,如下图:
问题代码如下:
// 通过按钮或者其他动作触发弹窗
getLocation() {
let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
let context: Context = getContext(this) as common.UIAbilityContext;
atManager.requestPermissionsFromUser(context,
['ohos.permission.LOCATION', 'ohos.permission.APPROXIMATELY_LOCATION'],
(err: BusinessError, data: PermissionRequestResult) => {
if (err) {
console.error(`requestPermissionsFromUser fail, err->${JSON.stringify(err)}`);
} else {
console.info('result:' + JSON.stringify(data));
if (data.authResults[0] === -1) {
if (data.dialogShownResults && data.dialogShownResults[0] === false) {
}
} else {
this.gotoNext()
}
}
});
}
// 路由跳转至下一个页面
gotoNext() {
this.getUserCurrentLocationAction().then((value: number) => {
router.pushUrl({
url: 'pages/NewPage'
})
}).catch(() => {
})
}
【背景知识】
- Router组件可以通过不同的url访问不同的页面(不推荐);
- Window组件提供窗口管理器,管理各个基本窗口单元;
- Navigation组件中的每个页面,承载在一个Page里,通过NavDestination容器实现基于组件的页面跳转(推荐)。
【定位思路】
弹窗关闭后主窗口和子窗口都不聚焦,一段时间后聚焦在子窗口上,所以会出现这样的问题,推荐以下三种思路:
(1)Navigation中的每个页面,承载在一个Page里,通过NavDestination容器实现基于组件的页面跳转(推荐项目将Router切换为Navigation进行跳转),详情参考:Router切换Navigation;
(2)切换焦点时,没有等待焦点切换完成,因为切换焦点是一个异步的过程,可以使用 async/await 改造;
(3)可以直接使用获取主窗口Router的方法跳转,确保页面跳转时焦点在主窗口。
【解决方案】
由于将Router跳转改造为Navigation跳转增会加额外的开发成本,同时想要快速解决问题,下面采用【定位思路】中的第三种方式,将问题代码中的gotoNext()方法改造:
gotoNext() {
this.getUserCurrentLocationAction().then((value: number) => {
let windowStage = AppStorage.get("windowStage") as window.WindowStage;
// 获取主窗口router
const mainR = windowStage.getMainWindowSync().getUIContext().getRouter();
mainR.pushUrl({
url: 'pages/NewPage'
})
}).catch(() => {
})
}
如下图,主页面已成功跳转。
【总结】
@ohos.router (页面路由)后续不再进行维护,推荐项目优先使用Navigation组件实现路由跳转;焦点切换属于异步动作,多组件的动作要正确需要确保焦点处于正确的组件上。
更多关于HarmonyOS 鸿蒙Next中如何解决主窗口页面跳转失败的问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html
更多关于HarmonyOS 鸿蒙Next中如何解决主窗口页面跳转失败的问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在鸿蒙Next中,主窗口页面跳转失败的问题可以通过以下方式解决:
-
使用Navigation组件:将Router跳转改为Navigation组件进行页面跳转,推荐使用NavDestination容器实现基于组件的页面跳转。
-
异步焦点切换:在焦点切换时,使用async/await确保焦点切换完成后再进行页面跳转。
-
获取主窗口Router:直接获取主窗口的Router进行跳转,确保跳转时焦点在主窗口。代码如下:
gotoNext() {
this.getUserCurrentLocationAction().then((value: number) => {
let windowStage = AppStorage.get("windowStage") as window.WindowStage;
const mainR = windowStage.getMainWindowSync().getUIContext().getRouter();
mainR.pushUrl({
url: 'pages/NewPage'
})
}).catch(() => {
})
}
通过以上方法,可以确保页面在主窗口中正确跳转。