HarmonyOS CustomDialog内子控件调用close()方法无效

controller调用时为undefined,无法关闭

HarmonyOS
2天前
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
fox280

在@CustomDialog装饰器中的controller不能用?:的形式声明,并且在组件中使用时,dialogController应该在当前组件下声明,不能在点击事件中声明。如果在事件中声明会导致CustomDialog内子组件的this指不到当前的controller,因此无法关闭弹窗,参考以下代码修改 的组件:

@Entry
@Component
struct CustomDialogUser {
  @Builder mycomp(){
    Button('showtosast')
      .onClick(() => {
        this.dialogController.open()
      })
  }
  dialogController: CustomDialogController = new CustomDialogController({
    builder: CustomDialogExample({
      cancel: ()=> { this.onCancel() },
      confirm: ()=> { this.onAccept() },
    }),
  })

  onCancel() {
    console.info('Callback when the first button is clicked')
  }

  onAccept() {
    console.info('Callback when the second button is clicked')
  }

  build() {
    Column() {
      this.mycomp()
    }.width('100%').margin({ top: 5 })
  }
}

@CustomDialog
struct CustomDialogExample {
  cancel?: () => void
  confirm?: () => void
  controller: CustomDialogController

  build() {
    Column() {
      Text('我是内容').fontSize(20).margin({ top: 10, bottom: 10 })
      Flex({ justifyContent: FlexAlign.SpaceAround }) {
        Button('cancel')
          .onClick(() => {
            this.controller.close()
            if (this.cancel) {
              this.cancel()
            }
          }).backgroundColor(0xffffff).fontColor(Color.Black)
        Button('confirm')
          .onClick(() => {
            this.controller.close()
            if (this.confirm) {
              this.confirm()
            }
          }).backgroundColor(0xffffff).fontColor(Color.Red)
      }.margin({ bottom: 10 })
    }
  }
}

传递builder后this指不到原先的controller,为了避免this指向改变,在TopNavigationView中声明以下代码:

@Builder MenuBuilder() {
  Text('123')
    .width(20)
    .height(20)
    .onClick(() => {
      this.dialogController.open()
    })
}
dialogController: CustomDialogController = new CustomDialogController({
  builder: DescriptionDialog(),
  alignment: DialogAlignment.Center
})

如果在LeaderBoardPage中声明builder,builder中的this指向的是LeaderBoardPage,传递到TopNavigationView后,this指向的是TopNavigationView,但是TopNavigationView中并没有声明dialogController,所以无法关闭弹窗。关于 写死弹窗的问题,弹窗的子组件是 builder: DescriptionDialog(),只需要修改DescriptionDialog组件即可修改弹窗形式,在这个builder中this是指向CustomDialogController的,所以可以打开弹窗。

分享
微博
QQ
微信
回复
2天前
相关问题
按钮内子控件如何动态更新
840浏览 • 1回复 待解决
HarmonyOS @CustomDialog 调用 pushUrl
299浏览 • 1回复 待解决
HarmonyOS 手机震动接口调用无效
312浏览 • 1回复 待解决
ATSUI可以调用JSUI的控件吗?
2099浏览 • 0回复 待解决
cocos引擎调用HarmonyOS系统方法
662浏览 • 1回复 待解决
TCPSocket on('close')错误码
453浏览 • 1回复 待解决
HarmonyOS拍照后调用openSync方法报错
610浏览 • 1回复 待解决
HarmonyOS调用子组件的方法
433浏览 • 1回复 待解决
HarmonyOS dialog调用open方法,不显示
323浏览 • 1回复 待解决
HarmonyOS js调用webview中的方法
488浏览 • 1回复 待解决
HarmonyOS 自定义方法链式调用
178浏览 • 1回复 待解决
HarmonyOS NAPI调用ArkTS的静态方法
597浏览 • 1回复 待解决
HarmonyOS 关于CustomDialog使用
364浏览 • 1回复 待解决