@Reusable 里面怎么正确使用 @Builder - HarmonyOS 鸿蒙Next

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

@Reusable 里面怎么正确使用 @Builder - HarmonyOS 鸿蒙Next

[@Reusable](/user/Reusable)
@Component
struct ReusableFlowItem {
  @State item: number = 0
  @Prop fontSize: number = 12

  // 从复用缓存中加入到组件树之前调用,可在此处更新组件的状态变量以展示正确的内容
  aboutToReuse(params: Record<string, number>) {
    this.item = params.item;
    console.info('Reuse item:' + this.item)
  }

  aboutToAppear() {
    console.info('item:' + this.item)
  }

  [@Builder](/user/Builder)
  itemBuild(icon: string, item: number) {
    Image($r(icon))
      .objectFit(ImageFit.Fill)
      .geometryTransition('geometryTransition' + icon )
      .sharedTransition('sharedImage' + icon + item, {duration: 300 });
  }

  build() {
    Column() {
      // 直接使用 itemBuild 会有复用错乱问题
      // this.itemBuild(getIcon(this.item), this.item)
      Image($r(getIcon(this.item)))
        .objectFit(ImageFit.Fill)
        .geometryTransition('geometryTransition' + getIcon(this.item) )
        .sharedTransition('sharedImage' + getIcon(this.item) + this.item, {duration: 300 });
      Text(getContent(this.item)).fontSize(this.fontSize).maxLines(3).textOverflow({overflow: TextOverflow.Ellipsis})
    }
    .alignItems(HorizontalAlign.Start)
  }
}

如上所述,直接使用 [@Builder](/user/Builder) itemBuild 会导致图片错乱,直接写Image 就正常。 如果我还是想用 [@Builder](/user/Builder) itemBuild,怎么让复用也正常呢


更多关于@Reusable 里面怎么正确使用 @Builder - HarmonyOS 鸿蒙Next的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

自定义构建函数(@Builder)默认的按值参数传递方式不支持动态改变组件,当传递的参数为状态变量时,状态变量的改变不会引起@Builder方法内的UI刷新,要实现UI动态刷新需要按引用传递参数

https://developer.huawei.com/consumer/cn/doc/harmonyos-faqs-V5/faqs-arkts-8-V5

有两种解决方法

①按引用传递参数

class Tmp {
  icon: string = ''
  item: number = 0
}

@Builder
itemBuild($$: Tmp) {
  Image($r($$.icon))
    .objectFit(ImageFit.Fill)
    .geometryTransition('geometryTransition'+$$.icon )
    .sharedTransition('sharedImage' + $$.icon + $$.item, {duration: 300 });
}

this.itemBuild({icon: getIcon(this.item), item: this.item})

② 封装成自定义组件

更多关于@Reusable 里面怎么正确使用 @Builder - HarmonyOS 鸿蒙Next的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS(鸿蒙)开发中,@Reusable@Builder 是两个与内存管理和对象构建相关的注解,但需要注意的是,这两个注解并不是鸿蒙系统特有的,而是通常在一些框架或库中用于简化代码和提高开发效率。在鸿蒙开发环境中,如果你使用的是兼容Java的框架(如某些UI框架或数据处理库),这些注解可能仍然适用。

要在@Reusable类中正确使用@Builder,你需要确保以下几点:

  1. @Reusable:通常用于标记一个可以被重用或缓存的类实例。在鸿蒙中,这更多依赖于具体的内存管理和依赖注入机制。

  2. @Builder注解:用于生成一个构建器类,以链式调用的方式创建对象实例。它简化了复杂对象的初始化过程。

  3. 结合使用:在@Reusable类中,如果你想使用@Builder,你需要确保该类有一个静态内部构建器类,该构建器类使用了@Builder注解,并且提供了所有必要的字段设置方法以及一个build()方法来生成实例。

示例代码框架:

@Reusable
public class MyClass {
    private final String field1;
    private final int field2;

    private MyClass(String field1, int field2) {
        this.field1 = field1;
        this.field2 = field2;
    }

    @Builder
    public static class MyClassBuilder {
        // 字段和方法
    }
}

请注意,具体实现可能因你使用的库或框架而异。如果问题依旧没法解决请联系官网客服,官网地址是 https://www.itying.com/category-93-b0.html

回到顶部