HarmonyOS鸿蒙Next中重复定义@Provide的key?
HarmonyOS鸿蒙Next中重复定义@Provide的key? 问题是:我重复定义了@Provide的key,运行起来没有报错!请问为啥可以正常运行呢?代码入下:
是不是我的组件树关系是 Index -> ComA -> ComC 和 Index -> ComB -> ComC,所以即使@Provide的key重复了,也是可以正常运行的,因为他们不在一个组件树上!
[文档:在组件树上不允许有同名@Provide。如果需要重载,则需要配置allowOverride](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V13/arkts-provide-and-consume-V13#provide支持allowoverride参数)
更多关于HarmonyOS鸿蒙Next中重复定义@Provide的key?的实战教程也可以访问 https://www.itying.com/category-93-b0.html
楼主,@Provide 装饰器绑定的key,在 Index -> ComA -> ComC 和 Index -> ComB -> ComC。没有冲突。你得index页面使用的 if 来加载两个不同的 ComA 或者 ComB。所以在一条组件树上,同时只有一个@Provide装饰绑定key,所以不会出现报错问题。
楼主可以实现一下,不使用 if 判断加载,同时将 ComA和ComB都挂载上,这样也不会报错。
代码如下:
build(){
Column() {
Button("切换按钮")
.onClick(() => {
this.switch = !this.switch
})
ComA()
ComB()
// if (this.switch) {
//
// } else {
//
// }
}
}
.width("100%")
.height("100%")
只有在什么在同一个链条下面的@Provide才会报错:
Error message:ComC: duplicate [@Provide](/user/Provide) property with name num. Property with this name is provided by one of the ancestor Views already. [@Provide](/user/Provide) override not allowed.
代码如下:
//index调用
Column() {
Button("切换按钮")
.onClick(() => {
this.switch = !this.switch
})
ComA()
ComB()
// if (this.switch) {
//
// } else {
//
// }
}
@Component
export struct ComA {
//声明 Provide
[@Provide](/user/Provide)("num") num: number = 0
build() {
Column() {
Text(this.num + "--ComA")
.fontSize(20)
.fontColor(Color.Black)
.fontWeight(FontWeight.Bold)
.textAlign(TextAlign.Center)
ComC()
}
}
}
@Component
export struct ComB {
//声明 Provide
[@Provide](/user/Provide)("num") num: number = 0
build() {
Column() {
Text(this.num + "--ComB")
.fontSize(20)
.fontColor(Color.Black)
.fontWeight(FontWeight.Bold)
.textAlign(TextAlign.Center)
ComC()
}
}
}
@Component
export struct ComC {
//### 在这里声明 Provide 同名的就会出现报错 #####
// 因为在父类中已经声明了 [@Provide](/user/Provide)("num"),在子布局在又定义就会出现报错情况。
// 解决报错问题:只需要替换名称 如:[@Provide](/user/Provide)({allowOverride : "num"}) num2: number = 10;
[@Provide](/user/Provide)("num") num2: number = 0
@Consume("num") num: number
build() {
Text(this.num + "--ComC")
.fontSize(20)
.fontColor(Color.Black)
.fontWeight(FontWeight.Bold)
.textAlign(TextAlign.Center)
}
}
更多关于HarmonyOS鸿蒙Next中重复定义@Provide的key?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next中,@Provide
装饰器用于声明状态变量,并通过key
进行唯一标识。重复定义相同的key
会导致编译错误,因为系统无法区分多个相同key
的状态变量。请确保每个@Provide
装饰的变量使用唯一的key
值,以避免冲突。
在HarmonyOS Next中,[@Provide](/user/Provide)
的key重复定义之所以没有报错,是因为这些重复定义发生在不同的组件树分支上,而不是在同一个组件树的同一层级。根据你提供的组件结构(Index → ComA → ComC 和 Index → ComB → ComC),ComA和ComB是Index的两个独立子组件,它们各自维护自己的[@Provide](/user/Provide)
上下文。因此,即使key相同,由于作用域隔离,运行时不会冲突。
文档中提到的“不允许同名@Provide”指的是同一组件树路径上的重复(例如父子组件间直接覆盖),而你的场景属于平行分支,互不影响。如果需要在同一路径上覆盖,才需使用allowOverride
参数。当前代码正常运行符合设计预期。