If a component attribute supports local initialization, a valid, runtime-independent default value s

问题如下:

If a component attribute supports local initialization, a valid, runtime-independent default value should be set for it.

在这里插入图片描述
我要写的是一个组件,其中使用@BuilderParam ⽤于装饰⾃定义组件(struct)中的属性,其装饰的属性可作为⼀个UI结构的占位符,待创建该组件时,可通过参数为其传⼊具体的内容

@Component
struct StateItem {
  //非空断言操作符,属性名后使用!来告诉TypeScript编译器这个属性在使用前一定会被赋值
  Icon: Resource=$r('app.media.ic_accuracy');
  name:string=''
  @BuilderParam content: () => void
  fontColor:Color=Color.White
  build() {
    Row(){
      Image(this.Icon).width(14).height(14)
      Text(this.name).fontSize(14).fontWeight(FontWeight.Medium).fontColor(this.fontColor)
      Blank()
      this.content()

    }
    
  }
}

然而编译出现开头的提示信息。点击信息给出右侧的参考内容。

原因

鸿蒙4.0的ArkTS语法规则强调了为支持本地初始化的组件属性设置有效且独立于运行时的默认值的重要性。这个规则旨在确保组件在没有外部配置或初始化时,仍然能够以一个明确且预期的状态运行。
我这里写的代码被检查出可能出问题:
这里的问题是属性content没有被赋予一个默认值。虽然 @BuilderParam 可能表明这个属性将在某处被构建器函数赋值,但在组件的本地初始化过程中,如果没有明确的默认值或外部赋值,它将保持为 undefined,这可能导致在 build 方法中调用this.content() 时出现错误

修改后如下:

@Builder function MyContentFunction(): void {}


@Component
struct StateItem {
  //非空断言操作符,属性名后使用!来告诉TypeScript编译器这个属性在使用前一定会被赋值
  Icon: Resource=$r('app.media.ic_accuracy');
  name:string=''
  @BuilderParam content: () => void=MyContentFunction
  fontColor:Color=Color.White
  build() {
    Row(){
      Image(this.Icon).width(14).height(14)
      Text(this.name).fontSize(14).fontWeight(FontWeight.Medium).fontColor(this.fontColor)
      Blank()
      this.content()

    }
    
  }
}

总结

这里,content属性被赋予了一个有效的默认值 MyContentFunction,这是一个满足 () => void 类型的函数。这样,即使在组件的其他部分没有显式地为content赋值,它也能在 build 方法中安全地被调用,因为它总是有一个有效的函数值。
在早期的arkts中,开头的写法是可以的,但是现在貌似在增强对代码规范的强制,所以,还是改一下吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值