Dialog的构建和open只能在@Component中么,如何封装一个统一逻辑的Dialog?

自定义Dialog的回调,而Dialog的构建是个重复的代码,而且量还不小。如何封装这部分代码,然后Dialog在不同的Component中显示出来。

HarmonyOS
2024-10-09 11:28:31
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
zxjiu

自定义的dialog可以通过export方式对外暴露:

@CustomDialog  
export default struct CustomDialogExample {  
  @Link textValue: string  
  @Link inputValue: string  
  controller: CustomDialogController  
  // 若尝试在CustomDialog中传入多个其他的Controller,以实现在CustomDialog中打开另一个或另一些CustomDialog,那么此处需要将指向自己的controller放在最后  
  cancel: () => void  
  confirm: () => void  
  
  build() {  
    Column() {  
      Text('Change text').fontSize(20).margin({ top: 10, bottom: 10 })  
      TextInput({ placeholder: '', text: this.textValue }).height(60).width('90%')  
        .onChange((value: string) => {  
          this.textValue = value  
        })  
      Text('Whether to change a text?').fontSize(16).margin({ bottom: 10 })  
      Flex({ justifyContent: FlexAlign.SpaceAround }) {  
        Button('cancel')  
          .onClick(() => {  
            this.controller.close()  
            this.cancel()  
          }).backgroundColor(0xffffff).fontColor(Color.Black)  
        Button('confirm')  
          .onClick(() => {  
            this.inputValue = this.textValue  
            this.controller.close()  
            this.confirm()  
          }).backgroundColor(0xffffff).fontColor(Color.Red)  
      }.margin({ bottom: 10 })  
    }  
    // dialog默认的borderRadius为24vp,如果需要使用border属性,请和borderRadius属性一起使用  
  }  
}

在需要用到dialog的@Component中import引入并初始化:

import CustomDialogExample from './CustomDialogExample';  
  
@Entry  
@Component  
struct CustomDialogUser {  
  @State textValue: string = ''  
  @State inputValue: string = 'click me'  
  dialogController: CustomDialogController = new CustomDialogController({  
    builder: CustomDialogExample({  
      cancel: this.onCancel,  
      confirm: this.onAccept,  
      textValue: $textValue,  
      inputValue: $inputValue  
    }),  
    cancel: this.existApp,  
    autoCancel: true,  
    alignment: DialogAlignment.Default,  
    offset: { dx: 0, dy: -20 },  
    gridCount: 4,  
    customStyle: false  
  })  
  
  // 在自定义组件即将析构销毁时将dialogControlle删除和置空  
  aboutToDisappear() {  
    delete this.dialogController, // 删除dialogController  
    this.dialogController = undefined // 将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(this.inputValue)  
        .onClick(() => {  
          if (this.dialogController != undefined) {  
            this.dialogController.open()  
          }  
        }).backgroundColor(0x317aff)  
    }.width('100%').margin({ top: 5 })  
  }  
}
分享
微博
QQ
微信
回复
2024-10-09 16:08:31
相关问题
如何封装一个自定义Dialog对话框
2220浏览 • 1回复 待解决
如何在全局实现一个自定义dialog弹窗
2821浏览 • 1回复 待解决
HarmonyOS 自定义dialog open无效
238浏览 • 1回复 待解决
HarmonyOS dialog调用open方法,不显示
314浏览 • 1回复 待解决
A是Component, B是Dialog, C是Component
264浏览 • 1回复 待解决
如何封装一个通用commonEvent工具类
1860浏览 • 1回复 待解决
是否支持统一styles样式封装
278浏览 • 1回复 待解决
如何一个Component画到Pixelmap上
1888浏览 • 1回复 待解决