HarmonyOS 鸿蒙Next 弹窗复用问题
HarmonyOS 鸿蒙Next 弹窗复用问题
下面这个弹窗的代码我想去复用,所有把他定义在了一个class对象里,但是CustomDialogController仅在作为@CustomDialog和@Component struct的成员变量,且在@Component struct内部定义时赋值才有效,否则弹窗弹不出来,有什么方法可以复用吗 而不是在每个组件使用的时候去copy 代码
model: MaterialDialog.Model = new MaterialDialog.Model();
dialogAttribute = new DialogAttributeModel()
dialogController: CustomDialogController = new CustomDialogController({
builder: MaterialDialog({ model: this.model, dialogAttribute: this.dialogAttribute }),
cancel: this.existDialog,
autoCancel: true,
alignment: this.model.dialogAligmentType,
customStyle: true
})
existDialog() {
console.info(‘Click the callback in the blank area’)
this.dialogController.close()
}
showCustomDialog(context: common.UIAbilityContext, goSettingMessage: string) {
this.model.title($r(“app.string.useOhosLocationServices”))
this.model.message(goSettingMessage)
this.model.positiveButton($r(‘app.string.agree’), () => {
context.startAbility({
bundleName: ‘com.huawei.hmos.settings’,
abilityName: ‘com.huawei.hmos.settings.MainAbility’,
uri: ‘application_info_entry’,
parameters: {
// 应用包名
pushParams: ‘com.foundersc.harm.xf’
}
})
})
this.model.negativeButton($r(‘app.string.disagree’), () => {
})
this.model.dialogAligmentType = DialogAlignment.Center
this.dialogController = new CustomDialogController({
builder: MaterialDialog({ model: this.model, dialogAttribute: this.dialogAttribute }),
cancel: this.existDialog,
autoCancel: true,
alignment: this.model.dialogAligmentType,
customStyle: true
})
this.dialogController.open()
}
更多关于HarmonyOS 鸿蒙Next 弹窗复用问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
2 回复
定义在class类里面,目前是不支持的。可以使用ohos.promptAction提供的弹窗组件,将弹窗内容封装成Builder单独放在arkts文件中。使用时import。 参考demo:
import { BusinessError } from '@ohos.base';
import { ComponentContent } from "@ohos.arkui.node";
class Params {
text: string = ""
constructor(text: string) {
this.text = text;
}
}//传参
@Builder
function buildText(params: Params) {
Row(){
Column() {
Text(params.text)
.fontSize(50)
.fontWeight(FontWeight.Bold)
.margin({bottom: 36})
}.backgroundColor('#FFF0F0F0')
}
.height("100%")
} //自定义组件的内容
@Entry
@Component
struct Index {
@State message: string = "显示TOAST"
build() {
Row() {
Column() {
Button("click me")
.onClick(() => {
let uiContext = this.getUIContext();
let promptAction = uiContext.getPromptAction();
let contentNode = new ComponentContent(uiContext, wrapBuilder(buildText), new Params(this.message));//上下文、自定义节点、传参
try {
promptAction.openCustomDialog(contentNode);
} catch (error) {
let message = (error as BusinessError).message;
let code = (error as BusinessError).code;
console.error(`OpenCustomDialog args error code is ${code}, message is ${message}`);
};
})
}
.width('100%')
.height('100%')
}
.height('100%')
}
}
更多关于HarmonyOS 鸿蒙Next 弹窗复用问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
针对HarmonyOS 鸿蒙Next弹窗复用问题,以下是一些可能的解决方案:
一、弹窗复用方法
- 创建子窗口:可以通过创建子窗口的方式实现弹窗复用。在EntryAbility中,使用AppStorage缓存windowStage,并在需要时通过windowStage创建子窗口。子窗口创建成功后,可以设置其位置、大小及相关属性,并加载对应的目标页面作为弹窗内容。
- 使用Stack布局:为了避免弹窗无法保持在目标页面或无法控制展示优先级的问题,可以使用Stack布局形式改造页面结构,统一管理弹窗组件,通过状态变量控制弹窗的显隐。
二、注意事项
- 确保在请求弹窗前,应用已获得必要的上下文和生命周期回调。
- 验证弹窗相关的权限列表是否正确,并符合HarmonyOS的权限管理要求。
- 如果弹窗无法弹出,可能是由于系统权限弹窗的模态化窗口级别较高导致,此时需要调整弹窗的级别或检查是否有其他弹窗正在显示。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html 。