HarmonyOS鸿蒙Next中tabs组件销毁后其index对应的状态变量会被置为0

HarmonyOS鸿蒙Next中tabs组件销毁后其index对应的状态变量会被置为0

有大佬们知道这个activeIndex最开始是1,下滑改变flag后为啥也会将这个activeIndex变成0呢?只有第一次操作时会这样,实体设备上也会这样

// xxx.ets
@Entry
@Component
struct SwipeGestureExample {
  @State activeIndex: number = 1;
  @State searchFlag: boolean = false;
  private tabsController: TabsController = new TabsController();

  @Builder tabBuilder(selfIndex: number, icon: Resource, name: Resource) {
    Column() {
      Image(icon)
        .width(32)
        .height(32)
        .fillColor(this.activeIndex === selfIndex ? '#c2e99607' : '#ff282323')
      Text(name)
        .fontSize(20)
        .fontColor(this.activeIndex === selfIndex ? '#e9925f06' : '#ff292626')
    }
    .backgroundColor('#ffffff')
    .opacity($r('app.float.common_opacity'))
    .border({ width: 2, color: '#BBBBBB' })
    .width('100%')
    .height('100%')
    .justifyContent(FlexAlign.Center)
    // 点击切换至指定页签
    .onClick(() => {
      this.activeIndex = selfIndex;
    })
  }

  build() {
    Column() {
      if (this.searchFlag) {
        Column()
          .width('100%')
          .height('100%')
          .backgroundColor(Color.Red)
          .gesture(
            PanGesture({ direction: PanDirection.Up })
              .onActionStart(() => {
                this.searchFlag = false
              })
          )
      } else {
        Tabs({ barPosition: BarPosition.End, index: this.activeIndex, controller: this.tabsController }) {
          TabContent() {
            Text('设置')
          }
          .tabBar(this.tabBuilder(0, $r("app.media.ic_collect"), $r('app.string.collect')))

          TabContent() {
            Text('主页')
          }.tabBar(this.tabBuilder(1, $r('app.media.ic_home'), $r('app.string.home')))

          TabContent() {
            Text('设置')
          }
          .tabBar(this.tabBuilder(2, $r('app.media.ic_setting'), $r('app.string.setting')))
        }
        .width('100%')
        .height('100%')
        .barMode(BarMode.Fixed)
        .barHeight($r('app.float.bar_height'))
        .gesture(
          PanGesture({ direction: PanDirection.Down })
            .onActionStart(() => {
              this.searchFlag = true
            })
        )
        .onChange(index => {
          this.activeIndex = index;
        })
      }
    }.width('100%')
  }
}
5 回复

使用tabs+tabContent切换也遇到这个问题~切换后大概1-2秒又会自动切换到首页~onchange方法返回的index又变回了0~楼主官方提供解决的方法了吗

更多关于HarmonyOS鸿蒙Next中tabs组件销毁后其index对应的状态变量会被置为0的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在API 9上这个问题没有解决,估计得要等到API 10了,你看看能不能通过其它的逻辑来限制这个index呢。

已确认是官方问题

![cke_368.png](https://alliance-communityfile-drcn.dbankcdn.com/FileServer/getFile/cmtybbs/161/209/242/0070086000161209242.20240125200448.56398016313339215340608598899765:50001231000000:2800:125E261ACCA35BCDE412E1B39AA224DCC1701E250F4CEABF00D6DE78BCE44A9E.png)

补充一下:通过日志看是第一次销毁Tabs时其index会被置为0,后面就不会在销毁时再置为0

在HarmonyOS鸿蒙Next中,当tabs组件被销毁时,其index对应的状态变量会被重置为0。这是因为组件的生命周期结束时,其内部状态会被清理,恢复到初始值。如果你希望在组件销毁时保留index的值,可以考虑将index存储在更高层级的组件或全局状态管理中,以确保其值在组件销毁后仍然可用。

回到顶部