HarmonyOS中如何在类中调用全局的弹窗

HarmonyOS中如何在类中调用全局的弹窗
前言
相信大家在开发中自定义弹窗都是用的@CustomDialog在每个页面都写一大堆初始化代码,并且在类中使用也是相当难调用,今天给老铁们分享使用 promptAction.openCustomDialog去在类中调用全局的弹窗。

如何使用?
第一步
先到EntryAbility这个文件存取上下文(必要条件)

onWindowStageCreate(windowStage: window.WindowStage): void {
windowStage.loadContent(‘pages/Index’, (err) => {
window.getLastWindow(this.context).then((data: window.Window) => {
let uiContext = data.getUIContext();
AppStorage.setOrCreate(‘UIContext’, uiContext);
});
});
}
1.
2.
3.
4.
5.
6.
7.
8.
写一个Builder(样式自定义)

export class Params {
text: ResourceStr = “”

constructor(text: ResourceStr) {
this.text = text;
}
}

@Builder
export function testTextBuilder(params: Params) {
Column() {
Text(params.text)
.textAlign(TextAlign.Center)
.fontSize(20)
.borderRadius(6)
.backgroundColor(‘rgba(24, 25, 26, 0.85)’)
.fontColor($r(‘sys.color.comp_background_list_card’))
.padding(16)
}

}
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
万事俱备只欠东风(定义全局类)
hchjzzs.com
m.hchjzzs.com
www.hchjzzs.com
xbtourism.com
m.xbtourism.com

export class DialogModel {
static showDialog(message: string) {
if (message != ‘’) {
let timeId: number = -1
// 获取上下文
let uiContext = AppStorage.get(‘UIContext’) as UIContext
let promptAction = uiContext.getPromptAction();
let contentNode = new ComponentContent(uiContext, wrapBuilder(testTextBuilder), new Params(message));
promptAction.openCustomDialog(contentNode, {
isModal: false,
onWillAppear: () => {
timeId = setTimeout(() => {
promptAction.closeCustomDialog(contentNode)
}, 2000)
},
onDidDisappear: () => {
clearTimeout(timeId)
},
keyboardAvoidMode: KeyboardAvoidMode.NONE,
showInSubWindow: true,
})
}
}
}
齐活开整

@Entry
@Component
struct Index {
build() {
Column() {
Button(‘点我,我就给你个弹窗’)
.onClick(() => {
DialogModel.showDialog(‘我就给你了’)
})
}
}
}
看看效果

<think>好的,我现在需要解决用户的问题:如何在鸿蒙系统中将自定义弹窗封装为全局可用的组件。首先,我得回忆一下鸿蒙开发的相关知识,特别是ArkUI框架。用户提到了引用中的几个资料,里面提到了封装弹窗UI组件、动态路由案例,以及如何通过动画和遮罩实现弹窗关闭。我需要结合这些信息来构建一个全局可用的弹窗组件。 首先,封装组件通常需要创建一个可复用的自定义组件。全局调用的话,可能需要将这个组件挂载到全局上下文或者使用单例模式,这样在任何页面都可以调用。根据引用[3],弹窗的结构包括模态遮罩和内容部分,并且通过动画控制显示和隐藏。另外,引用[1]提到步骤二封装弹窗UI组件,可能需要将弹窗的结构独立出来,并暴露接口给外部调用。 接下来,考虑如何实现全局调用。可能需要一个全局的管理,负责实例化弹窗组件,并在需要显示的时候将其添加到当前的页面中。例如,在引用[2]中,开发者需要解耦弹窗和UI组件,所以可能需要一个中间层来管理弹窗的显示和隐藏。 然后,代码结构方面,应该定义一个CustomDialog,继承自某个基础组件,比如@Component。内部结构包括Stack布局,包含遮罩层和内容区域。遮罩层的点击事件会触发关闭动画,这部分在引用[3]中有示例代码,使用animateTo来修改透明度和位置。 另外,全局调用可能需要将弹窗挂载到应用的生命周期中,或者使用Ability的上下文。例如,通过一个静态方法,在调用时获取当前页面的窗口,并将弹窗添加到窗口的根布局中。引用[1]中的动态路由案例可能涉及如何动态添加组件到页面,这可以借鉴到弹窗全局调用中。 最后,还需要考虑样式的自定义,比如位置、动画参数等,可以通过参数传入。例如,弹窗的位置可能在底部、中间或其他位置,根据不同的样式调整translateY等属性。引用[3]中的代码通过判断Alignment.Bottom来调整位置,这可以作为样式的配置项。 总结步骤:1. 创建自定义弹窗组件,包含遮罩和内容区域,支持动画。2. 封装全局管理,负责实例化和显示弹窗。3. 在需要的地方调用全局方法,传入参数显示弹窗。4. 处理弹窗的关闭逻辑和动画效果。同时,需要注意解耦,使得弹窗组件不依赖于具体页面,方便复用。</think>### HarmonyOS自定义弹窗全局封装实现方法 在鸿蒙系统中,通过ArkUI组件化能力封装全局弹窗需遵循以下步骤,实现效果与代码示例如下: #### 一、基础弹窗组件封装 ```typescript @Component export struct CustomDialog { @State opacityNum: number = 0 @State translateY: string = '100%' private dialogOptions?: DialogOptions build() { Stack() { // 模态遮罩层 Column() .width('100%') .height('100%') .backgroundColor('#66000000') .opacity(this.opacityNum) .onClick(() => this.closeAnimation()) // 弹窗内容容器 Column() { // 自定义内容插槽 if (this.dialogOptions?.builder) { this.dialogOptions.builder() } } .width('100%') .backgroundColor(Color.White) .translate({ y: this.translateY }) } } // 关闭动画逻辑 private closeAnimation() { animateTo({ duration: 200, curve: Curve.Friction, onFinish: () => { this.dialogOptions?.instance?.close() } }, () => { this.opacityNum = 0 this.translateY = "100%" }) } } ``` #### 二、全局服务层封装 ```typescript export class DialogService { private static instance: DialogService static getInstance() { if (!DialogService.instance) { DialogService.instance = new DialogService() } return DialogService.instance } show(options: DialogOptions) { const node = new CustomDialogNode(options) // 获取当前窗口根节点并挂载 getWindow(this.context).rootView.addChild(node) } } class CustomDialogNode extends CustomDialog { constructor(options: DialogOptions) { super() this.dialogOptions = options this.openAnimation() } private openAnimation() { animateTo({ duration: 300 }, () => { this.opacityNum = 1 this.translateY = '0%' }) } } ``` #### 三、全局调用示例 ```typescript // 在任意页面调用 DialogService.getInstance().show({ styles: { align: Alignment.Bottom }, builder: () => { return Column() { Text('自定义内容').fontSize(20) Button('关闭').onClick(() => DialogService.close()) } } }) ``` #### 关键技术要点: 1. **组件分层架构**:通过分离UI组件与服务层,实现业务逻辑与视图解耦[^2] 2. **动画同步控制**:使用animateTo实现遮罩透明度与内容位移动画同步,提升视觉流畅度[^3] 3. **动态挂载机制**:通过getWindow获取当前窗口上下文,动态挂载弹窗节点[^1] 4. **样式参数化**:支持通过DialogOptions配置弹窗位置、动画参数等样式属性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shadon178

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值