HarmonyOS 关于CustomDialog使用@Link监听数据闪退问题

当把TDialog放到独立函数里面的时候,带上text传参就会闪退,不带上就不会。

代码如下:

import { emitter } from '@kit.BasicServicesKit';
import { TDialog } from './TDialog';

@Entry
@Component
struct Index {
  dialogController?: CustomDialogController | null
  isLandscape: boolean = false
  @State text: string = "当前竖屏"

  build() {
    RelativeContainer() {
      Text(this.text)
        .fontSize(50)
        .fontWeight(FontWeight.Bold)
        .alignRules({
          center: { anchor: '__container__', align: VerticalAlign.Center },
          middle: { anchor: '__container__', align: HorizontalAlign.Center }
        })
    }
    .onClick(() => {
      this.openDialog()
    })
    .height('100%')
    .width('100%')
  }

  private openDialog() {
    if (this.dialogController == null) {
      this.dialogController = new CustomDialogController({
        builder: TDialog({ str: this.text }),
        alignment: DialogAlignment.Bottom,
        autoCancel: true,
        customStyle: true,
        cancel: () => {

        }
      });
    }
    this.dialogController?.open();
  }
}
@CustomDialog
export struct TDialog {
  controller?: CustomDialogController
  @Link str: string
  @Provide('coursePthInfo') coursePthInfo: NavPathStack = new NavPathStack()

  build() {
    Column() {
      Text(this.str)
    }
    .width("100%")
    .height(100)
    .borderRadius({
      topLeft: 12,
      topRight: 12
    }).backgroundColor(Color.White)
  }
}
HarmonyOS
1天前
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
aquaa

在ArkUI中CustomDialogController是一个页面级别的组件,其生命周期是与页面绑定的。CustomDialogController在页面中的使用是通过页面的生命周期管理的,例如在页面加载完成后初始化,并在页面退出时销毁。如果将其公开成一个函数,则无法保证其在正确的生命周期阶段被初始化和销毁,而且初始化后也不要再动态对diaogController进行重新赋值,否则会导致不可预期的行为,参考示例如下:

import { AlertDialog } from '@ohos.arkui.advanced.Dialog'

@Entry
@Component
struct Index {
  dialogControllerConfirm: CustomDialogController | undefined
  @State message: string = 'this is a message'

  deleteAccount() {
    this.message = 'nea vale1'
    console.log('deleteAccount')
  }

  aboutToAppear(): void {
    this.dialogControllerConfirm = new CustomDialogController({
      builder: AlertDialog({
        content: '文本文本文本文本文本',
        primaryButton: {
          value: '取消', action: () => {

          },
        },
        secondaryButton: {
          value: '确认',
          fontColor: $r('sys.color.ohos_id_color_warning'),
          action: () => {
            this.deleteAccount()
            console.info('Callback when the second button is clicked')
          }
        },
      }),
      autoCancel: true,
      customStyle: true,
      alignment: DialogAlignment.Bottom
    })
  }

  build() {
    Row() {
      Stack() {
        Column() {
          Text(this.message)
          Button("纯文本弹出框")
            .width(96)
            .height(40)
            .onClick(() => {
              this.dialogControllerConfirm?.open()
            })
        }
        .margin({ bottom: 300 })
      }
      .align(Alignment.Bottom)
      .width('100%')
      .height('100%')
    }
    .backgroundImageSize({ width: '100%', height: '100%' })
    .height('100%')
  }
}
分享
微博
QQ
微信
回复
1天前
相关问题
HarmonyOS应用退问题
732浏览 • 1回复 待解决
HarmonyOS 使用Webview会退
19浏览 • 1回复 待解决
HarmonyOS 关于CustomDialog使用
387浏览 • 1回复 待解决
HarmonyOS number toFixed方法退
31浏览 • 1回复 待解决
HarmonyOS 关于CustomDialog显示层级问题
13浏览 • 1回复 待解决
打开图库应用时偶尔会退
2437浏览 • 0回复 待解决
关于数据持久化使用问题
277浏览 • 1回复 待解决
加载FFMpeg后APP出现退
211浏览 • 1回复 待解决
HarmonyOS 页面返回时应用退报错
627浏览 • 1回复 待解决
HarmonyOS 申请短时后台任务退
34浏览 • 1回复 待解决
HarmonyOS customdialog使用问题
675浏览 • 1回复 待解决
HarmonyOS C++ 调用 ets 层函数报错退
46浏览 • 1回复 待解决
鸿蒙js开发 文件交互Api 退
6668浏览 • 2回复 待解决
退和报错日记获取有了解的吗?
2779浏览 • 1回复 待解决
HarmonyOS 关于@Watch监听状态问题
520浏览 • 1回复 待解决
HarmonyOS webview加载html string一直退
33浏览 • 1回复 待解决