Builder函数作为一个控件的入参时,Builder函数的click this没有指向原始的this(HarmonyOS 鸿蒙Next)
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
参考这个代码
@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
引用(通常是该内部类自身的实例)。
为了解决这个问题,你可以尝试以下几种方法:
-
使用外部类的引用:在Builder函数外部定义一个变量(如
final MyClass outerThis = this;
),然后在Builder函数内部使用这个变量代替this
。 -
确保Context正确:检查传递给Builder函数的Context是否正确,确保它是指向外层类或期望的上下文。
-
使用弱引用:如果担心内存泄漏,可以使用弱引用来持有外部类的引用。
如果以上方法仍然无法解决问题,可能是因为你的具体实现中存在其他细节问题。此时,建议直接查阅鸿蒙官方文档或相关开发资料,以确保你的实现符合鸿蒙的开发规范。
如果问题依旧没法解决请联系官网客服,官网地址是 https://www.itying.com/category-93-b0.html