请问下面的代码中,HarmonyOS 鸿蒙Next引用传递的值为什么没有修改?

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

请问下面的代码中,HarmonyOS 鸿蒙Next引用传递的值为什么没有修改?

//按引用传递参数
/***
* 1. 需要修改原始数据的值,而不仅仅是对数据进行读取操作。
* 2. 希望在函数或方法内部对参数进行修改,并且希望这些修改对原始数据产生影响。
*/
@Builder function ABuilder($$: { paramA1: string }) {

Row() {
Text(UseStateVarByReference: ${$$.paramA1})
}
}
//按值传递
// 函数或方法内对参数的修改不会影响到原始数据
@Builder function ABuilder2(paramA1: string) {

Row() {
Text(UseStateVarByValue: ${paramA1})
}
}

//??为啥无法改变值
function changeValue($$: { paramA1: string }) {
$$.paramA1 = ‘changed name’;
}

@Entry
@Component
struct Parent {
@State label: string = ‘Hello’;

build() {
Column() {
// 在Parent组件中调用ABuilder的时候,将this.label引用传递给ABuilder
ABuilder({ paramA1: this.label })
Button(‘Click me1’).onClick(() => {
// 点击“Click me”后,UI从“Hello”刷新为“ArkUI”
// this.label = ‘ArkUI’;
changeValue({ paramA1: this.label })
console.log(‘label’, this.label)
})

ABuilder2(this.label)
Button(‘Click me2’).onClick(() => {
// 点击“Click me”后,UI从“Hello”刷新为“ArkUI2”
this.label = ‘ArkUI2’;
})
}

}
}

7 回复

最后的代码

 
[@Builder](/user/Builder)
function ABuilder($$: { paramA1: string }) {

Row() { Text(${$$.paramA1}).hitTestBehavior(HitTestMode.None) }.onClick(() => { $$.paramA1 = “Builder改值: 222222222” }) }

//??为啥无法改变值 function changeValue($$: { paramA1: string }) { $$.paramA1 = 方法改值: <span class="hljs-number">111111111111</span> }

@Entry @Component struct Parent { @State paramA1: string = ‘…’;

build() { Column() { ABuilder(this) Button(‘Click me1’).onClick(() => { changeValue(this) }) }.width(‘100%’).backgroundColor(Color.Red).padding({ top: 200 })

} }<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>

同样遇到引用传递无法从@Builder内部更新状态变量的问题,找到这个帖子,看了这种this传递的解决方式,貌似只是特定用法和调用组件绑定了,但@Builder函数没法正常复用了。下面有说明。 问一下除此方式外,API 9 中现在能从@Builer函数中用引用传参数更新传递的状态变量吗?

引用传递的前提是[@Builder](/user/Builder)吧

我看手册@Builder和方法说是都可以修改的。请问如果用@Builder如何修改呢??

文档上没说单独的方法啊我看,都是基于@Builder的前提

就是你写的这种啊 @Builder function ABuilder($$: { paramA1: string })

在HarmonyOS鸿蒙系统中,如果你发现Next引用传递的值没有修改,这通常是由于以下几个原因导致的:

  1. 值类型与引用类型混淆:在Java或类似语言中,基本数据类型(如int, float等)是按值传递的,而对象是按引用传递的。如果你传递的是一个基本数据类型的包装类或值类型变量,那么实际上传递的是其副本,修改副本不会影响原变量。

  2. 方法内部未正确修改引用对象:确保在方法内部,你修改的是引用对象本身的属性或内容,而不是重新赋值一个新的对象给该引用。

  3. 线程安全问题:如果你的代码在多线程环境下运行,可能存在线程安全问题,导致修改未生效或被覆盖。

  4. 作用域问题:检查变量是否在正确的作用域内被修改和访问。

  5. 方法返回值未使用:如果方法设计为返回修改后的值,确保调用者接收并使用了这个返回值。

检查以上几点,确保你的代码逻辑正确,并且符合HarmonyOS鸿蒙系统的编程规范。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部