HarmonyOS 鸿蒙Next 跳转隐私协议,弹窗不盖住新的页面,回来的时候弹窗还在
HarmonyOS 鸿蒙Next 跳转隐私协议,弹窗不盖住新的页面,回来的时候弹窗还在
跳转隐私协议,弹窗不盖住新的页面,回来的时候弹窗还在
3 回复
参考demo:
name?: string,
onPop?: (data: PopInfo) => void
}
// 封装路由工具类,并注册自定义弹窗组件
class AppRouter {
private static instance = new AppRouter();
private pathStack: NavPathStack = new NavPathStack();
public static getInstance(): AppRouter {
return AppRouter.instance;
}
public getPathStack(): NavPathStack {
return this.pathStack;
}
private pushPath(name: string): void {
this.pathStack.pushPath({ name: name })
}
public static push(name: string): void {
AppRouter.instance.pushPath(name);
}
public static openDialog(name: string, params?: RouterParams): void {
AppRouter.instance.pathStack.pushPath({
name: name, param: params, onPop: (data: PopInfo) => {
if (params?.onPop) {
params.onPop!(data);
}
}
});
}
public static pop(): void {
AppRouter.instance.pathStack.pop();
}
}
[@Component](/user/Component)
// NavDestinationMode.DIALOG
struct DefaultDialog {
build() {
NavDestination() {
Stack({ alignContent: Alignment.Center }) {
Column() {
}
.width("100%")
.height("100%")
.backgroundColor('rgba(0,0,0,0.5)')
.transition(
TransitionEffect.OPACITY.animation({
duration: 300,
curve: Curve.Friction
})
)
.onClick(() => {
AppRouter.pop();
})
Column() {
Text("dialogA")
.fontColor(Color.White)
Button("push pageC", { stateEffect: true, type: ButtonType.Capsule })
.onClick(() => {
AppRouter.push("pageC")
})
}
.width("50%")
.height("30%")
.backgroundColor('#ffae2d2d')
.transition(
TransitionEffect.scale({ x: 0, y: 0 }).animation({
duration: 300,
curve: Curve.Friction
})
)
}
.width("100%")
.height("100%")
}
.mode(NavDestinationMode.DIALOG)
.hideTitleBar(true)
}
}
[@Component](/user/Component)
struct PageA {
[@Consume](/user/Consume)('pageInfos') pageInfos: NavPathStack;
build() {
NavDestination() {
Button('push dialogA', { stateEffect: true, type: ButtonType.Capsule })
.onClick(() => {
AppRouter.openDialog("DefaultDialog");
}).margin(10)
}.title('PageA')}
}
[@Component](/user/Component)
struct PageC {
[@Consume](/user/Consume)('pageInfos') pageInfos: NavPathStack;
build() {
NavDestination() {
Column() {
Text('pageC')
.margin(10)
Button('返回', { stateEffect: true, type: ButtonType.Capsule })
.onClick(() => {
AppRouter.pop();
}).margin(10)
}
}.mode(NavDestinationMode.STANDARD)
}
}
[@Entry](/user/Entry)
[@Component](/user/Component)
struct pageRoot01 {
[@Provide](/user/Provide)('pageInfos') pageInfos: NavPathStack = new NavPathStack()
// 显隐控制设置为不占用
[@State](/user/State) visible: Visibility = Visibility.None
[@Builder](/user/Builder)
PagesMap(name: string) {
if (name == 'pageA') {
PageA()
} else if (name == 'pageC') {
PageC()
} else if (name == 'DefaultDialog') {
DefaultDialog()
}
}
build() {
// 在根页面中注册NavPathStack
Navigation(AppRouter.getInstance().getPathStack()) {
Stack({ alignContent: Alignment.Center }) {
Column() {
Button('push PageA', { stateEffect: true, type: ButtonType.Capsule })
.onClick(() => {
AppRouter.push('pageA')
})
}
}
.height("100%")
.width("100%")
}
.hideTitleBar(true)
.navDestination(this.PagesMap)
}
}
用navigation,不要用dialog
在HarmonyOS鸿蒙Next系统中,实现跳转隐私协议时弹窗不盖住新页面,并在返回时保持弹窗显示,这通常涉及到多任务处理、弹窗层级管理以及页面生命周期管理。以下是一些可能的技术实现思路:
-
弹窗层级管理:确保弹窗的层级设置合理,使其不会覆盖新打开的页面。这可以通过调整弹窗的
z-index
或相应的层级属性来实现。 -
页面生命周期监听:在新页面打开和返回时,通过监听页面生命周期事件(如
onPageShow
、onPageHide
等),控制弹窗的显示与隐藏。确保在返回时重新显示弹窗。 -
多任务与内存管理:确保弹窗在后台不被系统回收。可以通过设置弹窗的持久性属性,或者在返回时重新创建弹窗。
-
使用系统API:利用HarmonyOS提供的系统API,如多任务管理、窗口管理等,来精确控制弹窗的行为。
-
测试与调试:在不同设备和场景下充分测试,确保弹窗行为符合预期。
请注意,具体实现可能因HarmonyOS版本和具体开发环境而异。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html。