HarmonyOS 鸿蒙Next CustomDialog在Component组件中controller一直是undefined

发布于 1周前 作者 bupafengyu 最后一次编辑是 5天前 来自 鸿蒙OS

HarmonyOS 鸿蒙Next CustomDialog在Component组件中controller一直是undefined

export struct CustomCommonDialog {

controller: CustomDialogController //这个一直提示undfine。
cancel: () => void = this.setCancel
confirm: () => void = this.setConfirm
@Prop message:string = ''
@Prop leftbt:string = '取消'
@Prop leftFontColor:string = '#FF8300'
@Prop rightbt:string = '确定'
@Prop img:string = 'app.media.bg_internal_warning_dialog'

build() {

Column(){
Column() {
Text(this.message) {
}.fontSize(13).fontColor('#333333').margin({left: 15, right:15}).fontWeight(FontWeight.Bold).textAlign(TextAlign.Center)

Image($r(`${this.img}`))
.width("100%")
.height(38)
.objectFit(ImageFit.Fill)
.position({x: 0, y: 96})

Image($r('app.media.ic_alert_close'))
.width(13)
.height(13)
.objectFit(ImageFit.Fill)
.position({x: '90%', y:10})
.onClick(() => {
this.controller.close()
})

}.width(288).height(134).backgroundColor(Color.White).borderRadius(10).justifyContent(FlexAlign.Center).alignItems(HorizontalAlign.Center)

Row(){
Button(this.leftbt)
.width(115)
.height(38)
.fontSize(15)
.fontColor(this.leftFontColor)
.type(ButtonType.Normal)
.fontWeight(FontWeight.Bold)
.margin({ left: 10 })
.backgroundColor("#ffffff")
.borderRadius(10)
.onClick(() => {
this.controller.close()
this.cancel()
}).margin({left:20, right:20})

Button(this.rightbt)
.width(115)
.height(38)
.fontSize(15)
.fontColor("#ffffff")
.borderRadius(10)
.type(ButtonType.Normal)
.fontWeight(FontWeight.Bold)
.backgroundColor("#FF8300")
.onClick(() => {
this.controller.close()
this.confirm()
}).margin({left:20, right:20})

}.margin({top:14, bottom:10})
}.alignItems(HorizontalAlign.Center).justifyContent(FlexAlign.Center).margin({left:10, right:10})
}

setCancel() {

}

setConfirm() {

}

}





@Component
export struct WXDialog {
public show() {
let controller = new CustomDialogController({
builder: CustomCommonDialog({
leftbt: '取消',
leftFontColor: '#FF9500',
rightbt: '打卡',
message: '"新东方小书童”想要打开微信',
confirm: () => {
}
}), customStyle: true, autoCancel: false
})
controller.open()
}

build() {
}
}

更多关于HarmonyOS 鸿蒙Next CustomDialog在Component组件中controller一直是undefined的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

如果是想要修改自定义弹窗的样式,可以参考demo:

// xxx.ets

[@CustomDialog](/user/CustomDialog)

struct CustomDialogExample {

  controller: CustomDialogController //这个一直提示undfine。

  cancel: () => void = this.setCancel

  confirm: () => void = this.setConfirm

  [@Prop](/user/Prop) message:string = ''

  [@Prop](/user/Prop) leftbt:string = '取消'

  [@Prop](/user/Prop) leftFontColor:string = '#FF8300'

  [@Prop](/user/Prop) rightbt:string = '确定'

  [@Prop](/user/Prop) img:string = 'app.media.bg_internal_warning_dialog'

  build() {

    Column(){

      Column() {

        Text(this.message) {

        }.fontSize(13).fontColor('#333333').margin({left: 15, right:15}).fontWeight(FontWeight.Bold).textAlign(TextAlign.Center)

        Image($r(`${this.img}`))

          .width("100%")

          .height(38)

          .objectFit(ImageFit.Fill)

          .position({x: 0, y: 96})

        Image($r('app.media.startIcon'))

          .width(13)

          .height(13)

          .objectFit(ImageFit.Fill)

          .position({x: '90%', y:10})

          .onClick(() => {

            this.controller.close()

          })

      }.width(288).height(134).backgroundColor(Color.White).borderRadius(10).justifyContent(FlexAlign.Center).alignItems(HorizontalAlign.Center)

      Row(){

        Button(this.leftbt)

          .width(115)

          .height(38)

          .fontSize(15)

          .fontColor(this.leftFontColor)

          .type(ButtonType.Normal)

          .fontWeight(FontWeight.Bold)

          .margin({ left: 10 })

          .backgroundColor("#ffffff")

          .borderRadius(10)

          .onClick(() => {

            this.controller.close()

            this.cancel()

          }).margin({left:20, right:20})

        Button(this.rightbt)

          .width(115)

          .height(38)

          .fontSize(15)

          .fontColor("#ffffff")

          .borderRadius(10)

          .type(ButtonType.Normal)

          .fontWeight(FontWeight.Bold)

          .backgroundColor("#FF8300")

          .onClick(() => {

            this.controller.close()

            this.confirm()

          }).margin({left:20, right:20})

      }.margin({top:14, bottom:10})

    }.alignItems(HorizontalAlign.Center).justifyContent(FlexAlign.Center).margin({left:10, right:10})

  }

  setCancel() {

  }

  setConfirm() {

  }

}

[@Entry](/user/Entry)

[@Component](/user/Component)

struct CustomDialogUser {

  dialogController: CustomDialogController | null = new CustomDialogController({

    builder: CustomDialogExample({

      leftbt: '左边',

      leftFontColor: '#FF9500',

      rightbt: '右边',

      message: '"新东方小书童”想要打开微信',

      cancel: ()=> { this.onCancel() },

      confirm: ()=> { this.onAccept() }

    }),

    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 },

    customStyle: false,

    cornerRadius: 20,

    width: 300,

    height: 200,

    borderWidth: 1,

    borderStyle: BorderStyle.Dashed,//使用borderStyle属性,需要和borderWidth属性一起使用

    borderColor: Color.Blue,//使用borderColor属性,需要和borderWidth属性一起使用

    backgroundColor: Color.White,

    shadow: ({ radius: 20, color: Color.Grey, offsetX: 50, offsetY: 0}),

  })

  // 在自定义组件即将析构销毁时将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 CustomDialog在Component组件中controller一直是undefined的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


[@CustomDialog](/user/CustomDialog) 注解没加吧

cke_136.png

在HarmonyOS鸿蒙系统中,如果你遇到Next CustomDialog在Component组件中controller一直是undefined的问题,这通常是因为Dialog的controller没有正确初始化或者没有正确传递到使用的地方。

确保你按照以下步骤操作:

  1. 正确创建Dialog:使用CustomDialog的构造函数来创建Dialog实例,并确保传递了正确的上下文(Context)。

  2. 初始化Controller:在Dialog的构造或初始化过程中,确保controller已经被正确初始化。通常,controller是在Dialog的某个方法中设置的,确保这个方法被调用。

  3. 传递Controller:如果你需要在其他组件或方法中访问Dialog的controller,确保你已经将controller正确传递给了这些组件或方法。

  4. 检查生命周期:确保在Dialog的生命周期内,controller没有被意外地置为null或未定义。检查Dialog的打开和关闭逻辑,确保controller在这些过程中保持有效。

  5. 调试和日志:使用调试工具和日志输出来跟踪controller的状态,查看它是在哪个步骤变为undefined的。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部