HarmonyOS 鸿蒙Next 自定义命令式弹框
HarmonyOS 鸿蒙Next 自定义命令式弹框
主要通过ComponentContent类和uiContext.getPromptAction().openCustomDialog实现。 具体代码如下:
const uiContext = await this.getUIContext()
const closeOnBack = options.closeOnBack ?? true
const onWillDismiss = options.onWillDismiss;
const onDidDisappear = options.onDidDisappear;
const id = options.id ? options.id : new BaseSingleDialog().id;
const componentContent = new ComponentContent(uiContext,
wrapperBuilder, attachProperty(options, {
onWillDismiss: (dismiss: DismissDialogAction) => {
if (dismiss.reason === DismissReason.PRESS_BACK && !closeOnBack) {
return;
}
onWillDismiss ? onWillDismiss(dismiss) : dismiss.dismiss()
},
onDidDisappear: () => {
// 及时移除销毁实例
const removeInfo = MBaseDialogApi.dialogs.find(_ => _.id === id);
if (removeInfo) {
MBaseDialogApi.removeDialog(removeInfo.id);
removeInfo.componentContent && removeInfo.componentContent.dispose()
}
onDidDisappear?.()
}
}))
uiContext.getPromptAction().openCustomDialog(componentContent, options)
自定义内容依靠的WrappedBuilder类,比如:
const componentContent = new ComponentContent(uiContext,wrapBuilder(CustomDialogBuilder))
@Builder
export function CustomDialogBuilder(options: CustomOptions) {
CustomDialogView({ options, builder: options.builder })
}
@Component
struct CustomDialogView {
@Prop options: CustomOptions;
@BuilderParam builder?: () => void;
build() {
Column() {
this.builder?.()
}
.height(this.options.height)
.width(this.options.width)
}
}
具体代码示例可参考仓库源代码
更多关于HarmonyOS 鸿蒙Next 自定义命令式弹框的实战教程也可以访问 https://www.itying.com/category-93-b0.html
2 回复
HarmonyOS 鸿蒙Next自定义命令式弹框,通常可以通过CustomDialog或创建SubWindow来实现。但这种方式可能会遇到一些问题,如弹窗无法保持在目标页面,或无法控制弹窗展示优先级等。
为解决这些问题,可以考虑使用Stack层叠布局的形式改造页面整体结构,在页面左上角预留一个宽高均为0的组件作为弹窗展示容器,统一管理所有弹窗。通过状态变量控制弹窗的显隐,并使用Column或Stack组件控制弹窗的展示顺序和层级。
此外,自定义弹窗时还需注意以下几点:
- 确保弹窗的层级设置正确,避免被其他UI组件覆盖。
- 检查弹窗的布局文件,确保没有不必要的边距或对齐方式导致内容被遮挡。
- 确认应用具备在屏幕上显示弹窗的必要权限。
- 检查鸿蒙系统版本与弹窗组件的兼容性。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html 。