HarmonyOS 鸿蒙Next 关于生命周期问题

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

HarmonyOS 鸿蒙Next 关于生命周期问题 如下页面:

@ComponentV2
struct CertificateTabContentComp {
  @Param list: ConditionPeopleModel[] = []
  controller: StateController = new StateController()

  onDidBuild(): void {
    if (ArrayUtil.isNotEmpty(this.list)) {
      this.controller.content()
    } else {
      this.controller.empty()
    }
  }

  build() {
    StateLayout({
      controller: this.controller, 
      contentBuilder: () => {
        this.certificateBuilder()
      }
    })
  }

  @Builder
  certificateBuilder() {
    List() {
      ForEach(this.list, (item: ConditionPeopleModel) => {
        ListItem() {
          Text(item.CategoryName)
            .fontColor(Colors.Color33)
            .fontSize(16)
            .padding(12)
            .backgroundColor(Color.White)
            .fontWeight(FontWeight.Bold)
            .ellipsisMode(EllipsisMode.END)
            .textOverflow({ overflow: TextOverflow.Ellipsis })
            .maxLines(2)
        }.width('100%').backgroundColor(Color.White)
      })
    }.width('100%').height('100%')
  }
}

StateLayout大致如下:

@ComponentV2
export struct StateLayout {
  @Param controller: StateController = new StateController()

  onDidBuild(): void {
    if (this.controller) {
      this.controller.loadingEvent = this.loading
      this.controller.emptyEvent = this.empty
      this.controller.errorEvent = this.error
      this.controller.networkErrorEvent = this.networkError
      this.controller.contentEvent = this.content
    }
  }

  build() {
    Column() {
      if (this.localState == StateEnum.LOADING) {
        if (GlobalStateConfig.globalLoadingBuilder) {
          GlobalStateConfig.globalLoadingBuilder.builder({
            loadingStr: this.localLoadingStr,
            progressColor: this.localProgressColor
          })
        } else {
          this.DefaultLoadingBuilder()
        }
      } else if (this.localState == StateEnum.EMPTY) {
        if (GlobalStateConfig.globalEmptyBuilder) {
          GlobalStateConfig.globalEmptyBuilder.builder({ emptyStr: this.localEmptyStr, emptyIcon: this.localEmptyIcon })
        } else {
          this.DefaultEmptyBuilder()
        }
      } else if (this.localState == StateEnum.ERROR) {
        if (GlobalStateConfig.globalErrorBuilder) {
          GlobalStateConfig.globalErrorBuilder.builder({
            errorStr: this.localErrorStr,
            errorIcon: this.localErrorIcon,
            retryStr: this.localRetryStr,
            retry: this.priorityRetry ?? this.retry,
            showLoadingWhenRetry: this.showLoadingWhenRetry
          })
        } else {
          this.DefaultErrorBuilder()
        }
      } else if (this.localState == StateEnum.NETWORK_ERROR) {
        if (GlobalStateConfig.globalNetworkBuilder) {
          GlobalStateConfig.globalNetworkBuilder.builder({
            networkErrorStr: this.localNetworkErrorStr,
            networkErrorIcon: this.localNetworkErrorIcon,
            retryStr: this.localRetryStr,
            retry: this.priorityRetry ?? this.retry,
            showLoadingWhenRetry: this.showLoadingWhenRetry
          })
        } else {
          this.DefaultNetworkErrorBuilder()
        }
      } else {
        this.contentBuilder()
      }
    }.alignItems(HorizontalAlign.Center).justifyContent(FlexAlign.Center).layoutWeight(1)
  }
}

问题在于, 我的controller.empty 应该写在哪里? 目前不管是onDidBuilder还是aboutToAppear中, 如果没有延迟, 会导致 页面还没绘制完成, 导致controller控制无效 StateLayout是一个开源框架: https://ohpm.openharmony.cn/#/cn/detail/@chawloo%2Fstate-layout


更多关于HarmonyOS 鸿蒙Next 关于生命周期问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

这边大概看了下你写的 StateLayout 三方库,当数据是通过接口获取时,先加载后显示内容没有问题,但当数据非接口获取时,empty()显示异常,controller控制无效,可将其写在onAppear (组件挂载显示后触发此回调)或者 onPageShow (页面每次显示时触发一次,仅@Entry装饰的自定义组件生效) 生命周期中, 参考链接:

https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/ts-universal-events-show-hide-V5#onappear

https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/ts-custom-component-lifecycle-V5#onpageshow

@ComponentV2 struct CertificateTabContentComp { @Param list: string[] = [] @Param controller: StateController = new StateController()

aboutToAppear(): void { // this.loading() }

onPageShow(): void { // if (this.list.length) { // this.controller.content() // } else { // this.controller.empty() // } }

//模拟网络加载 loading() { setTimeout(() => { if (this.list.length) { this.controller.content() } else { this.controller.empty() } }, 2000) }

build() { Column() { StateLayout({ controller: this.controller, contentBuilder: () => { this.certificateBuilder() } }) } .height(‘100%’) .width(‘100%’) .onAppear(() => { if (this.list.length) { this.controller.content() } else { this.controller.empty() } }) }

@Builder certificateBuilder() { List() { ForEach(this.list, (item: string) => { ListItem() { Text(item) .fontColor(Color.Red) .fontSize(16) .padding(12) .backgroundColor(Color.White) .fontWeight(FontWeight.Bold) .ellipsisMode(EllipsisMode.END) .textOverflow({ overflow: TextOverflow.Ellipsis }) .maxLines(2) } .width(‘100%’) .backgroundColor(Color.White) }) } .width(‘100%’) .height(‘100%’) } }

更多关于HarmonyOS 鸿蒙Next 关于生命周期问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


针对帖子标题“HarmonyOS 鸿蒙Next 关于生命周期问题”,以下是对鸿蒙系统(HarmonyOS)中生命周期相关问题的直接回答:

在HarmonyOS中,生命周期管理对于应用开发至关重要。它涉及应用从启动到退出,以及在不同状态下的行为管理。鸿蒙系统的生命周期管理主要包括以下几个方面:

  1. 应用启动与停止:当应用被用户启动或系统唤醒时,会进入启动状态;当用户关闭应用或系统资源紧张导致应用被回收时,应用会进入停止状态。

  2. 活动状态管理:应用中的页面或组件在可见与不可见之间切换时,会触发相应的生命周期回调,如onShow()onHide()等,以便开发者进行资源管理和状态保存。

  3. 后台行为限制:为了优化系统性能和电池续航,鸿蒙系统对后台应用的行为进行了严格管理。应用在后台运行时,可能会受到各种限制,如限制CPU使用、禁止网络访问等。

  4. 内存回收机制:当系统内存不足时,鸿蒙系统会触发内存回收机制,优先回收不活跃的应用或组件,以释放内存资源。

开发者需要充分了解并合理利用这些生命周期管理机制,以确保应用在鸿蒙系统上的稳定性和性能表现。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部