HarmonyOS鸿蒙Next中【@BuilderParams】当@BuilderParams参数传入一个全局@Builder,发生异常

HarmonyOS鸿蒙Next中【@BuilderParams】当@BuilderParams参数传入一个全局@Builder,发生异常 当@BuilderParams参数传入一个全局@Builder,发生以下异常。但如果把全局@Builder改为局部@Builder则无此问题。像咨询原因和推荐的解决方式。

异常信息

Reason: TypeError Error name: TypeError Error message: Cannot read property observeComponentCreation2 of undefined SourceCode: (parent ? parent : this).observeComponentCreation2((elmtId, isInitialRender) => { ^
Stacktrace: at MyButton (entry/src/main/ets/pages/Page.ets:34:18) at builder (entry/src/main/ets/pages/Page.ets:25:11) at initialRender (entry/src/main/ets/pages/Page.ets:9:7)

参考代码

@Component
struct SomeComponent {
  @BuilderParam builder: () => void

  build() {
    Row() {
      Text('标题').layoutWeight(1)
      this.builder()
    }.width('100%')
  }
}

@Entry
@Component
struct Page {
  text = 'hi'

  build() {
    Column() {
      SomeComponent({
        builder: () => {
          MyButton()
        }
      })
    }.width('100%')
  }
}

[@Builder](/user/Builder)
function MyButton() {
  Text('Button')
}

更多关于HarmonyOS鸿蒙Next中【@BuilderParams】当@BuilderParams参数传入一个全局@Builder,发生异常的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

报错是由于预览页面/组件含有未初始化成功的成员变量,调用这些成员变量的属性/方法时会导致报错,如果你想使用全局@Builder,可以使用下列方式:

@Component
struct SomeComponent {
  @BuilderParam builder: () => void = MyButton

  build() {
    Row() {
      Text('标题')
        .layoutWeight(1)
      this.builder()
    }
    .width('100%')
  }
}

@Entry
@Component
struct Page {
  text = 'hi'
  build() {
    Column() {
      SomeComponent()
    }
    .width('100%')
  }
}

[@Builder](/user/Builder) function MyButton() {
  Text('Button')
}

参考文档:初始化builderparam装饰的方法

更多关于HarmonyOS鸿蒙Next中【@BuilderParams】当@BuilderParams参数传入一个全局@Builder,发生异常的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


@BuilderParam builder: () => void

需要添加初始值

@BuilderParam builder: () => void = ()=>{}

在HarmonyOS鸿蒙Next中,@BuilderParams用于传递构建函数(@Builder)作为参数。当将全局@Builder作为参数传递给@BuilderParams时,可能会发生异常。这种异常通常是由于@BuilderParams无法正确解析或处理全局@Builder的上下文或依赖关系所导致的。

具体来说,@BuilderParams在解析传入的@Builder时,会尝试根据当前的上下文环境来构建UI组件。如果传入的是全局@Builder,它可能无法正确获取到所需的上下文信息,从而导致构建失败或抛出异常。

要解决这个问题,可以尝试将全局@Builder转换为局部@Builder,确保它在正确的上下文中被调用。或者,检查@BuilderParams的使用方式,确保传入的@Builder符合预期的工作流程。

此外,确保@BuilderParams@Builder的声明和使用符合鸿蒙OS的规范,避免在构建函数中引入不必要的依赖或复杂的逻辑,这也有助于减少异常的发生。

在HarmonyOS鸿蒙Next中,@BuilderParams用于传递构建函数(@Builder)。当全局@Builder作为参数传入时发生异常,可能原因包括:

  1. 作用域问题:全局@Builder可能未在正确的作用域内定义或引用。
  2. 参数类型不匹配@BuilderParams期望的构建函数签名与传入的全局@Builder不匹配。
  3. 生命周期问题:全局@Builder可能在组件生命周期外被调用。

建议检查@Builder的定义、作用域及调用时机,确保其符合预期。

回到顶部