HarmonyOS beta3设备上修改了系统设置的“24小时制”后回到应用,当前页面内通过LazyForEach构建的Swiper重走每个Item组件的初始化,关键的是此时传入的item数据不在list的实例里面,这个数据实例是哪来的呢?

如题:HarmonyOS beta3设备上修改了系统设置的“24小时制”后回到应用,当前页面内通过LazyForEach构建的Swiper重走每个Item组件的初始化,关键的是此时传入的item数据不在list的实例里面,这个数据实例是哪来的呢?

阅读 597
1 个回答

1、@ObjectLink传递/访问,参考:

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-observed-and-objectlink-V5\#变量的传递访问规则说明

SwiperExample({
  testObj: new TestObj()
})修改为:
@State data: TestObj = new TestObj()
SwiperExample1({ testObj: this.data })

2、完整代码:

// index.ets
class MyDataSource0821 implements IDataSource {
  private list: ImageItem[] = [];
  private listeners: DataChangeListener[] = [];

  constructor(list: ImageItem[]) {
    this.list = [...list]
  }

  totalCount(): number {
    return this.list.length
  }

  getData(index: number): ImageItem {
    return this.list[index]
  }

  registerDataChangeListener(listener: DataChangeListener): void {
    this.listeners.push(listener);
  }

  unregisterDataChangeListener(listener: DataChangeListener) {
    const pos = this.listeners.indexOf(listener);
    if (pos >= 0) {
      this.listeners.splice(pos, 1);
    }
  }
}

class ImageItem {
  text: string = '';
  url: string = '';

  constructor(text: string, url: string = '') {
    this.text = text;
    this.url = url;
  }
}

@Observed
export class TestObj {
  data: MyDataSource0821 = new MyDataSource0821([])

  constructor() {
    let list: ImageItem[] = []
    for (let i = 1; i <= 10; i++) {
      list.push(new ImageItem(i.toString()));
    }
    this.data = new MyDataSource0821(list)
  }
}

@Component
struct SwiperInner1 {
  item?: ImageItem;

  build() {
    Text(this.item?.text)
      .width('90%')
      .height(160)
      .backgroundColor(0xAFEEEE)
      .textAlign(TextAlign.Center)
      .fontSize(30)
  }
}

@Component
export struct SwiperExample1 {
  @ObjectLink testObj: TestObj;

  build() {
    Swiper() {
      LazyForEach(this.testObj.data, (item: ImageItem) => {
        SwiperInner1({
          item: item
        })
      }, (item: ImageItem) => item.text)
    }
    .width('100%')
    .effectMode(EdgeEffect.None)
    .cachedCount(1)
    .index(1)
    .loop(false)
    .indicator(false)
    .itemSpace(0)
    .curve(Curve.Linear)
    .onChange((index: number) => {
      console.info(index.toString())
    })
    .onGestureSwipe((index: number, extraInfo: SwiperAnimationEvent) => {
      console.info("index: " + index)
      console.info("current offset: " + extraInfo.currentOffset)
    })
    .onAnimationStart((index: number, targetIndex: number, extraInfo: SwiperAnimationEvent) => {
      console.info("index: " + index)
      console.info("targetIndex: " + targetIndex)
      console.info("current offset: " + extraInfo.currentOffset)
      console.info("target offset: " + extraInfo.targetOffset)
      console.info("velocity: " + extraInfo.velocity)
    })
    .onAnimationEnd((index: number, extraInfo: SwiperAnimationEvent) => {
      console.info("index: " + index)
      console.info("current offset: " + extraInfo.currentOffset)
    })
  }
}


@Entry
@Component
struct Index {
  @State data: TestObj = new TestObj()

  build() {
    Column() {
      SwiperExample1({ testObj: this.data })
    }

  }
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进