HarmonyOS鸿蒙Next中自定义弹窗渲染全局builder报错问题

HarmonyOS鸿蒙Next中自定义弹窗渲染全局builder报错问题

全局builder直接放入promptAction.openCustomDialog会报错“Error message:Cannot read property observeComponentCreation2 of undefined”,如果用wrapBuilder转换后给openCustomDialog会报“is not callable”,报错行都指向builder。

是否有人遇到过相同问题,求教🥺

IDE是目前最新的5.0.5,手机API是5.0.4(16)

源码:https://gitee.com/cangqionghai/global-builder-bug

相关代码:

import { promptAction } from '@kit.ArkUI';

@Entry
@Component
struct Index {
  build() {
    RelativeContainer() {
      Column(){
        Row { 
          Button('全局Builder弹窗')
            .onClick(() => {
              console.log('GB',GlobalLoadingBuilder.builder)
              promptAction.openCustomDialog({builder: ()=>GlobalLoadingBuilder.builder()})
            })
          Button('普通Builder弹窗')
            .onClick(() => {
              promptAction.openCustomDialog({builder: ()=>LoadingBuilder()})
            })
        }
        .justifyContent(FlexAlign.SpaceEvenly)
        .width('100%')
      }
      .height('100%')
      .justifyContent(FlexAlign.Center)
    }
    .height('100%')
    .width('100%')
  }
}

@Builder
function LoadingBuilder() {
  Column(){
    Text( '加载中...' )
      .fontColor('#333')
      .fontSize(18)
      .margin({top: 20})
  }
  .justifyContent(FlexAlign.Center)
}

const GlobalLoadingBuilder:WrappedBuilder<[]> = wrapBuilder(LoadingBuilder);

更多关于HarmonyOS鸿蒙Next中自定义弹窗渲染全局builder报错问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

这边没有复现问题,能够提供一个完整的问题复现demo吗?

更多关于HarmonyOS鸿蒙Next中自定义弹窗渲染全局builder报错问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


项目链接

描述

这是一个用于全球构建工具的bug跟踪和管理项目。

在HarmonyOS Next中,自定义弹窗渲染全局builder报错通常是由于builder函数未正确声明或作用域问题导致。确保builder函数定义为全局可用,并正确绑定到自定义弹窗组件。检查builder返回的UI组件是否符合ArkTS语法规范,避免使用未导入的组件或错误属性。若使用@Builder装饰器,需确认其声明位置在全局作用域。常见错误包括builder内使用了局部变量或未正确处理异步数据。

这个问题是由于全局Builder在HarmonyOS Next中的使用方式导致的。从代码来看,主要存在两个问题:

  1. 直接使用GlobalLoadingBuilder.builder()会报"observeComponentCreation2 undefined"错误,这是因为全局Builder需要特殊的上下文环境。

  2. 使用wrapBuilder转换后调用方式不正确,导致"is not callable"错误。

解决方案是修改调用方式:

// 正确的调用方式应该是:
promptAction.openCustomDialog({
  builder: GlobalLoadingBuilder.builder // 直接传入builder引用,不要调用()
}

或者保持原有方式但修改wrapBuilder的用法:

// 修改全局Builder声明
const GlobalLoadingBuilder = wrapBuilder(() => LoadingBuilder());

// 使用时
promptAction.openCustomDialog({
  builder: GlobalLoadingBuilder // 直接传入包装后的Builder
}

核心原因是全局Builder在HarmonyOS Next中需要保持其原始引用形式,不能直接调用。这个问题在API 5.0.4版本中确实存在,建议检查Builder的声明和使用方式是否匹配。

回到顶部