HarmonyOS 鸿蒙Next @BuilderParam中this指针问题

发布于 1周前 作者 gougou168 来自 鸿蒙OS

HarmonyOS 鸿蒙Next @BuilderParam中this指针问题

示例代码如下,this.message始终是undefined:

@Entry

@Component

struct Index {

  @State message: string = ‘@BuilderParam示例’;

  @Builder

  buildTest(text: string) {

    // !!!此处的this.message始终是undefined!!!

    Text(${text} --- ${this.message})

  }

  build() {

    Column() {

      Text("-----")

          .fontSize(18)

          .fontWeight(FontWeight.Bold)

      DemoView({ demoBlock: this.buildTest})

    }

    .height(‘100%’)

  }

}

@Component

struct DemoView {

  @BuilderParam demoBlock: (text: string) => void;

  build() {

    Column() {

      this.demoBlock(“test @BuilderParam”)

    }

  }

}

9 回复
我发现换一种写法就可以this引用为父组件数据了
DemoView({demoBlock: ()=>{this.buildTes()}})

我也碰到此问题,还准备提交问题单呢,多谢!

有要学HarmonyOS AI的同学吗,联系我:https://www.itying.com/goods-1206.html

  DemoView({ demoBlock: this.buildTest})
这样传值,this指向的是子组件DemoView,子组件中没有message变量,所以是undefined。

改为  DemoView({demoBlock: ()=>{this.buildTes()}}),this指向的还是父组件,父组件有message变量,所以有值。

参考文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-builderparam-0000001820999553

补充下,认真看下官方开发文档就很清楚了。

需注意this指向正确。

以下示例中,Parent组件在调用this.componentBuilder()时,this指向其所属组件,即“Parent”。[@Builder](/user/Builder) componentBuilder()通过this.componentBuilder的形式传给子组件[@BuilderParam](/user/BuilderParam) customBuilderParam,this指向在Child的label,即“Child”。[@Builder](/user/Builder) componentBuilder()通过():void=>{this.componentBuilder()}的形式传给子组件[@BuilderParam](/user/BuilderParam) customChangeThisBuilderParam,因为箭头函数的this指向的是宿主对象,所以label的值为“Parent”。

BuilderParam 方法里的 this,指向的是调用BuilderParam方法的组件
这里的this.message指向的是demoview组件的message
[@Builder](/user/Builder)函数传递给子组件后其内的this也指向子组件,因此找不到message;这是文档中指出过的,传递的只是函数,this是根据调用场景指向实际调用此函数的组件。如果需要子组件引用父组件数据,则用[@Prop](/user/Prop),[@Link](/user/Link)之类 进行变量传递,或无需同步用普通变量也可。

在HarmonyOS(鸿蒙)开发中,如果你在@BuilderParam注解中遇到了this指针的问题,这通常与注解的使用场景或Java/Kotlin的语法限制有关。@BuilderParam主要用于构造器注解,帮助自动构建对象,而this在注解内部或注解处理时并不直接可用,因为它依赖于类实例的上下文。

请检查你的使用场景是否误将this用于注解参数或注解处理逻辑中。确保@BuilderParam的使用符合其设计目的,即用于标注构造器参数以支持构建器模式。

如果问题依旧没法解决请加我微信,我的微信是itying888。

回到顶部