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参数)

cke_2023.png

cke_2622.png

cke_3427.png


更多关于HarmonyOS鸿蒙Next中重复定义@Provide的key?的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

楼主,@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参数。当前代码正常运行符合设计预期。

回到顶部