HarmonyOS鸿蒙Next中自定义弹窗(CustomDialog)封装在函数中报错

HarmonyOS鸿蒙Next中自定义弹窗(CustomDialog)封装在函数中报错 我在做业务的时候,有很多相同的弹框,想把这些弹框的初始化封装在函数中,然后通过函数进行调用,结果报错了

写法如下:

cke_8328.png

cke_9025.png

报错信息如下:

cke_11735.png

错误日志如下:

Device info:OpenHarmony 3.2
Build info:OpenHarmony 3.2.9.1
Module name:com.example.harmonymusic
Version:1.0.0
Pid:4411
Uid:20040006
Reason:Signal:SIGSEGV(SEGV_MAPERR)@0x0000000000000290
Thread name:com.example.har

#00 pc 0000000001873b79 /system/lib64/libace.z.so (482e7a90e9ff2e241a79a9c405a9730c)
#01 pc 0000000001875a71 /system/lib64/libace.z.so (482e7a90e9ff2e241a79a9c405a9730c)
#02 pc 00000000003ffbf4 /system/lib64/libark_jsruntime.so (8ef042f942210dcf45c6431c798421b4)
#03 pc 00000000002dc2da /system/lib64/libark_jsruntime.so (8ef042f942210dcf45c6431c798421b4)
#04 pc 00000000002d9408 /system/lib64/libark_jsruntime.so (8ef042f942210dcf45c6431c798421b4)
#05 pc 000000000038dfb5 /system/lib64/libark_jsruntime.so (8ef042f942210dcf45c6431c798421b4)
#06 pc 0000000000400492 /system/lib64/libark_jsruntime.so(panda::FunctionRef::Call(panda::ecmascript::EcmaVM const*, panda::Local<panda::JSValueRef>, panda::Local<panda::JSValueRef> const*, int)+1058) (8ef042f942210dcf45c6431c798421b4)
#07 pc 0000000001afea72 /system/lib64/libace.z.so (482e7a90e9ff2e241a79a9c405a9730c)
#08 pc 00000000018641e8 /system/lib64/libace.z.so (482e7a90e9ff2e241a79a9c405a9730c)
#09 pc 000000000185d730 /system/lib64/libace.z.so (482e7a90e9ff2e241a79a9c405a9730c)
#10 pc 000000000191f0d3 /system/lib64/libace.z.so (482e7a90e9ff2e241a79a9c405a9730c)
#11 pc 00000000013b917a /system/lib64/libace.z.so (482e7a90e9ff2e241a79a9c405a9730c)
#12 pc 00000000013cf476 /system/lib64/libace.z.so (482e7a90e9ff2e241a79a9c405a9730c)
#13 pc 013cee97 /system/lib64/libace.z.so (482e7a90e9ff2e241a79a9c405a9730c)
#14 pc 00000000013d161a /system/lib64/libace.z.so (482e7a90e9ff2e241a79a9c405a9730c)
#15 pc 00000000013cc46b /system/lib64/libace.z.so (482e7a90e9ff2e241a79a9c405a9730c)
#16 pc 00000000013d2a19 /system/lib64/libace.z.so (482e7a90e9ff2e241a79a9c405a9730c)
#17 pc 00000000013d1e4f /system/lib64/libace.z.so (482e7a90e9ff2e241a79a9c405a9730c)
#18 pc 00000000013d28e5 /system/lib64/libace.z.so (482e7a90e9ff2e241a79a9c405a9730c)
#19 pc 00000000013cffbe /system/lib64/libace.z.so (482e7a90e9ff2e241a79a9c405a9730c)
#20 pc 00000000013d2766 /system/lib64/libace.z.so (482e7a90e9ff2e241a79a9c405a9730c)
#21 pc 00000000013d1a42 /system/lib64/libace.z.so (482e7a90e9ff2e241a79a9c405a9730c)
#22 pc 0000000000d9f3a9 /system/lib64/libace.z.so (482e7a90e9ff2e241a79a9c405a9730c)
#23 pc 0000000000d9f09e /system/lib64/libace.z.so (482e7a90e9ff2e241a79a9c405a9730c)
#24 pc 0000000000e8079c /system/lib64/libace.z.so (482e7a90e9ff2e241a79a9c405a9730c)
#25 pc 00000000017ebe1f /system/lib64/libace.z.so (482e7a90e9ff2e241a79a9c405a9730c)
#26 pc 0000000000e32c71 /system/lib64/libace.z.so (482e7a90e9ff2e241a79a9c405a9730c)
#27 pc 0000000000010ca9 /system/lib64/platformsdk/libeventhandler.z.so(OHOS::AppExecFwk::EventHandler::DistributeEvent(std::__h::unique_ptr<OHOS::AppExecFwk::InnerEvent, void (*)(OHOS::AppExecFwk::InnerEvent*)> const&)+505) (6dd02bcdad70c6551a80ce5f415f6603)
#28 pc 000000000001ad52 /system/lib64/platformsdk/libeventhandler.z.so (6dd02bcdad70c6551a80ce5f415f6603)
#29 pc 00000000000196a8 /system/lib64/platformsdk/libeventhandler.z.so(OHOS::AppExecFwk::EventRunner::Run()+56) (6dd02bcdad70c6551a80ce5f415f6603)
#30 pc 0000000000087ce0 /system/lib64/libappkit_native.z.so(OHOS::AppExecFwk::MainThread::Start()+480) (94ca62b6337e500de1050d413f61e30c)
#31 pc 000000000001572c /system/bin/appspawn (2778b21557cf967b8bf23975a093a84f)
#32 pc 0000000000015825 /system/bin/appspawn (2778b21557cf967b8bf23975a093a84f)
#33 pc 0000000000014f7c /system/bin/appspawn (2778b21557cf967b8bf23975a093a84f)
#34 pc 000000000002c44a /system/lib64/libbegetutil.z.so (aa9b33d17515ab6026831e5e0aeb274f)
#35 pc 000000000002c173 /system/lib64/libbegetutil.z.so (aa9b33d17515ab6026831e5e0aeb274f)
#36 pc 0000000000029f85 /system/lib64/libbegetutil.z.so(ProcessEvent+85) (aa9b33d17515ab6026831e5e0aeb274f)
#37 pc 0000000000029af1 /system/lib64/libbegetutil.z.so (aa9b33d17515ab6026831e5e0aeb274f)
#38 pc 00000000000141e6 /system/bin/appspawn (2778b21557cf967b8bf23975a093a84f)
#39 pc 00000000000125ca /system/bin/appspawn (2778b21557cf967b8bf23975a093a84f)
#40 pc 0000000000090cf9 /vendor/aosp/system/lib64/libc.so(__libc_init+89) (2de37b8aa6e96dd64a6cfa51bd78ae6e)

按照官方的写法放在 @Entry @Component 进行初始化时没问题的。但是需要用到的地方都需要进行一次初始化,比较麻烦,也不能统一弹框的逻辑

请问是不能做 @Entry @Component 之外进行初始化吗


更多关于HarmonyOS鸿蒙Next中自定义弹窗(CustomDialog)封装在函数中报错的实战教程也可以访问 https://www.itying.com/category-93-b0.html

15 回复

不能封装,要疯了,这比Flutter可差远了。

更多关于HarmonyOS鸿蒙Next中自定义弹窗(CustomDialog)封装在函数中报错的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


真的是服了,这个装饰器,搞的写一个简单的UI效果都要弯弯绕绕几圈

是因为装饰器的原因,个人感觉装饰器极大限制了编程的灵活性,不知道为啥要用这种模式。

有什么好的方案吗,

  • 项目名称: 示例项目
  • 项目描述: 这是一个示例项目,用于演示如何将HTML转换为Markdown。
  • 开发者: 张三
  • 开始日期: 2023-01-01
  • 预计完成日期: 2023-12-31

参考一下flutter设计,很灵活简洁,

  • 字体颜色: 深色代码主题
  • 图片:

我的建议是把自定义弹窗封装到一个类,然后哪个业务用就在哪个业务里面调用就行,

装到一个类也没用吧,要用@Component装饰里面才能使用CustomDialogController,Class里用不生效,

我也遇到了相同的问题,我想在公共业务里面弹窗,但是CustomDialogController无法再非装饰器外使用,请问楼上解决了吗。

这种方案我也不知道合不合理,大伙可以给点意见。

  1. 封装一个A组件,bulid()里不写任何布局,初始化一个弹窗变量,然后在里面监听事件,事件id取的父组件的id加一个固定值

aboutToAppear() { let that = this; // 事件id this.eventId = that[‘parent_’][‘id_’] + CustomAlertDialogEventId; let event: emitter.InnerEvent = { eventId: this.eventId } emitter.on(event, (data: emitter.EventData) => { this.callBack(data); }) }


callBack里面处理弹窗close or open

2. 封装一个Class,里面写个类方法


/**
   * 自定义弹窗
   * @param component 当前需要加弹窗的组件 一般传this
   * @param options
   */
  static show(component: Object, options?: AlertDialogOptions) {
    CustomAlert.currentOptions = options;
    let that: NewComponent = component as NewComponent;
    // 事件id 父组件id + 起始值
    let eventId: number = that['id_'] + CustomAlertDialogEventId;
    // 发送事件时传递的数据,数据类型支持字符串、整型和布尔型
    emitter.emit({ eventId: eventId });
  }
  1. 将A组件放到需要弹窗的界面,然后使用类方法调用弹窗,将当前this传进去,主要确保发送的事件id和接收事件的id一致

这种方案我也不知道合不合理,大伙可以给点意见。

我试了用dialog.bind()可以

局限性太大了

有用正常脑回路的解决这个问题的了吗?

你按官网的示例写一个看看,这种报错窗口我弹过好次,莫名其妙的,直接关了,重启开发工具应该可以。

在HarmonyOS鸿蒙Next中封装CustomDialog时,报错可能是由于以下原因:

  1. 上下文未正确传递:确保在创建CustomDialog时传递了正确的Context对象。
  2. 生命周期问题:确保CustomDialog的生命周期与Activity或Fragment的生命周期同步,避免在销毁后仍进行操作。
  3. 资源未释放:在Dialog关闭时,确保释放相关资源,避免内存泄漏。
  4. UI线程问题:确保在UI线程中操作CustomDialog,避免在非UI线程中直接操作UI组件。

检查以上问题,通常可以解决自定义弹窗封装时遇到的错误。

回到顶部