Builder函数作为一个控件的入参时,Builder函数的click this没有指向原始的this(HarmonyOS 鸿蒙Next)

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

Builder函数作为一个控件的入参时,Builder函数的click this没有指向原始的this(HarmonyOS 鸿蒙Next)

有一个页面Page, 里面有一个控件View, 从Page给View 传递了一个构建的Builder函数, 但该函数的onClick this 没有指向Page。(导致title 不更新)

@Component
struct View {
  @Builder defaultBulder() {}
  @BuilderParam rightBuilder: ()=>void = this.defaultBulder
  build() {
   Column() {
      this.rightBuilder()
   }
 }
}
@Entry
@Component
struct Page {

  @State title: string = ''
  build() {
    Column() {
        Text(this.title)
        View({rightBuilder: this.rightBuilder})
    }
  }

 @Builder
  rightBuilder() {
    Button('右边按钮').onClick(() => {
        this.title = '点击了'
    })
  }
}

更多关于Builder函数作为一个控件的入参时,Builder函数的click this没有指向原始的this(HarmonyOS 鸿蒙Next)的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

参考这个代码

@Component
struct CustomContainer {
  @Prop header: string = '';
  @Builder defaultBulder(){}

  @BuilderParam rightBuilder(): () => void = this.defaultBulder
  build() {
    Column() {
      this.rightBuilder()
    }
  }
}
@Component
struct CustomContainerUser {
  @State text: string = 'header';

  build() {
    Column() {
      Text(this.text)
      CustomContainer({ header: this.text }) {
        Column() {
          this.rightBuilder('testA', 'testB')
        }.backgroundColor(Color.Yellow)
        .onClick(() => {
          this.text = 'changeHeader';
        })
      }
    }

  }
  @Builder  rightBuilder(label1: string, label2: string) {
  Column() {
        Button('右边按钮').onClick(() => {
          this.text = '点击了'
          console.log('qqqq1=',this)
        })
  }
}

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

更多关于Builder函数作为一个控件的入参时,Builder函数的click this没有指向原始的this(HarmonyOS 鸿蒙Next)的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


改成下面这样就可以更新了。

在HarmonyOS(鸿蒙)Next中,当Builder函数作为控件的入参时,如果Builder函数内部的click this没有指向原始的this,这通常是因为作用域或上下文(Context)的问题。

在鸿蒙开发中,控件的事件处理往往依赖于特定的上下文来正确引用。如果Builder函数内部定义的点击事件处理器(如setClickedListener)中的this没有正确指向外层类或控件的实例,可能是因为匿名内部类或Lambda表达式默认捕获了一个不同的this引用(通常是该内部类自身的实例)。

为了解决这个问题,你可以尝试以下几种方法:

  1. 使用外部类的引用:在Builder函数外部定义一个变量(如final MyClass outerThis = this;),然后在Builder函数内部使用这个变量代替this

  2. 确保Context正确:检查传递给Builder函数的Context是否正确,确保它是指向外层类或期望的上下文。

  3. 使用弱引用:如果担心内存泄漏,可以使用弱引用来持有外部类的引用。

如果以上方法仍然无法解决问题,可能是因为你的具体实现中存在其他细节问题。此时,建议直接查阅鸿蒙官方文档或相关开发资料,以确保你的实现符合鸿蒙的开发规范。

如果问题依旧没法解决请联系官网客服,官网地址是 https://www.itying.com/category-93-b0.html

回到顶部