HarmonyOS 鸿蒙Next能否持久化一个弹窗,不用每次都重新创建一个新的弹窗呢?
HarmonyOS 鸿蒙Next能否持久化一个弹窗,不用每次都重新创建一个新的弹窗呢?
使用
@CustomDialog 创建了一个这样的 dialog ,用于选择省市县,现在每次弹窗都会重新生成一个新的,如何持久化的持有这个 dialog 呢?
更多关于HarmonyOS 鸿蒙Next能否持久化一个弹窗,不用每次都重新创建一个新的弹窗呢?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
弹窗消失,组件肯定是回释放的,不需要持久化去持有,只需要存储下这个弹窗关注的状态,放到外面存储。再次调用弹窗的时候,把这些状态变量传入就行。
参考demo:
@CustomDialog
struct CustomDialogExample {
controller?: CustomDialogController
cancel: () => void = () => {
}
confirm: () => void = () => {
}
@Link SaveClickNum : number
@State clickNum: number = -1
aboutToAppear(): void {
this.clickNum = this.SaveClickNum
}
aboutToDisappear(): void {
this.SaveClickNum = this.clickNum
}
private arr:number[] = [0,1,2,3,4,5]
build() {
Column() {
Text("请选择").fontSize(30)
Scroll() {
List() {
ForEach(this.arr, (item: number) => {
ListItem(){
Text("chose" + item)
.fontSize(15)
.fontColor(item == this.clickNum ? Color.Blue : Color.Black)
}.onClick(()=>{
this.clickNum = item
})
.backgroundColor(item == this.clickNum ? Color.Orange : Color.White)
})
}
}
Button('点我关闭弹窗')
.onClick(() => {
if (this.controller != undefined) {
this.controller.close()
}
})
.margin(20)
}
}
}
@Entry
@Component
struct CustomDialogUser {
@State clickNum: number = -1
aboutToAppear(): void {
}
dialogController: CustomDialogController | null = new CustomDialogController({
builder: CustomDialogExample({
cancel: ()=> { this.onCancel() },
confirm: ()=> { this.onAccept() },
SaveClickNum: this.clickNum
}),
cancel: this.existApp,
autoCancel: true,
onWillDismiss:(dismissDialogAction: DismissDialogAction)=>{
console.info("reason=" + JSON.stringify(dismissDialogAction.reason))
console.log("dialog onWillDismiss")
if (dismissDialogAction.reason == DismissReason.PRESS_BACK) {
dismissDialogAction.dismiss()
}
if (dismissDialogAction.reason == DismissReason.TOUCH_OUTSIDE) {
dismissDialogAction.dismiss()
}
},
alignment: DialogAlignment.Center,
offset: { dx: 0, dy: -20 },
gridCount: 4,
showInSubWindow: true,
isModal: true,
customStyle: false,
cornerRadius: 10,
})
// 在自定义组件即将析构销毁时将dialogController置空
aboutToDisappear() {
this.dialogController = null // 将dialogController置空
}
onCancel() {
console.info('Callback when the first button is clicked')
}
onAccept() {
console.info('Callback when the second button is clicked')
}
existApp() {
console.info('Click the callback in the blank area')
}
build() {
Column() {
Button('click me')
.onClick(() => {
if (this.dialogController != null) {
this.dialogController.open()
}
}).backgroundColor(0x317aff)
}.width('100%').margin({ top: 5 })
}
}
更多关于HarmonyOS 鸿蒙Next能否持久化一个弹窗,不用每次都重新创建一个新的弹窗呢?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS(鸿蒙)系统中,持久化弹窗的需求可以通过管理弹窗的生命周期和状态来实现,而不是直接“持久化”一个UI组件。鸿蒙系统提供了丰富的UI框架和组件管理机制,允许开发者控制组件的显示与隐藏,而不是每次都重新创建。
要实现这一功能,你可以采取以下策略:
-
单例模式:确保应用中弹窗实例的唯一性,通过单例模式管理弹窗的创建和显示。
-
状态管理:利用鸿蒙的状态管理机制(如数据绑定、ViewModel等),根据应用状态控制弹窗的显示与隐藏。
-
页面栈管理:如果弹窗是作为页面存在,可以通过页面栈管理其生命周期,避免重复创建。
-
自定义组件:将弹窗封装为自定义组件,通过组件的状态控制其显示,而不是销毁和重建。
在具体实现时,你可以根据弹窗的复杂性和使用场景选择合适的方法。例如,对于简单的提示框,可以通过单例模式和状态管理轻松实现;对于复杂的弹窗页面,则可能需要结合页面栈和自定义组件来实现。
如果问题依旧没法解决请联系官网客服,官网地址是 https://www.itying.com/category-93-b0.html,