先给出一个基本的示例;

类似这样的开发,我们常用的选择大多是List中嵌套ListItem,又或者是写一个Column布局然后用@Builder封装公用样式;不过不管怎么写,点击不同的操作肯定是进行不同的业务;那我们就可以给@Builder传入我们自定义的函数进去;

直接上代码;

首先需要一个对象用来存储我们的函数入参,因为官网文档中提到,@Builder接收按引用传递和按值传递,但是我们这儿两种都不是,所以需要包装一层对象;

class ActionFunc {
  onclick: Function = () => {}

  constructor(func: Function) {
    this.onclick = func;
  }
}

接着,在@Builder中使用他;

  @Builder
  listItem(icon: ResourceStr, text: string, func?: ActionFunc) {
    Row() {
      Row({ space: rvp(8) }) {
        Image(icon).width(rvp(20)).height(rvp(20))
        Text(text).fontSize(rvp(16)).fontColor('#333333')
      }

      Image($r('app.media.right')).width(rvp(20)).height(rvp(20))
    }
    .width('100%')
    .height(rvp(64))
    .borderRadius(rvp(8))
    .backgroundColor(Color.White)
    .justifyContent(FlexAlign.SpaceBetween)
    .padding({ left: rvp(16), right: rvp(16) })
    .onClick(() => {
      if (func) {
        func?.onclick()
      }
      else {
        promptAction.showToast({ message: "功能正在快马加鞭开发中..." })
      }
    })
  }

那这样,我们传入参数也变得简单了,只需要定义一个函数,然后new一个对象,将我们的函数当成一个属性传进去;

这样 ,即可完成我们自定义的需求;

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐