HarmonyOS 鸿蒙Next 关于生命周期问题
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
这边大概看了下你写的 StateLayout 三方库,当数据是通过接口获取时,先加载后显示内容没有问题,但当数据非接口获取时,empty()显示异常,controller控制无效,可将其写在onAppear (组件挂载显示后触发此回调)或者 onPageShow (页面每次显示时触发一次,仅@Entry装饰的自定义组件生效) 生命周期中, 参考链接:
@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中,生命周期管理对于应用开发至关重要。它涉及应用从启动到退出,以及在不同状态下的行为管理。鸿蒙系统的生命周期管理主要包括以下几个方面:
-
应用启动与停止:当应用被用户启动或系统唤醒时,会进入启动状态;当用户关闭应用或系统资源紧张导致应用被回收时,应用会进入停止状态。
-
活动状态管理:应用中的页面或组件在可见与不可见之间切换时,会触发相应的生命周期回调,如
onShow()
和onHide()
等,以便开发者进行资源管理和状态保存。 -
后台行为限制:为了优化系统性能和电池续航,鸿蒙系统对后台应用的行为进行了严格管理。应用在后台运行时,可能会受到各种限制,如限制CPU使用、禁止网络访问等。
-
内存回收机制:当系统内存不足时,鸿蒙系统会触发内存回收机制,优先回收不活跃的应用或组件,以释放内存资源。
开发者需要充分了解并合理利用这些生命周期管理机制,以确保应用在鸿蒙系统上的稳定性和性能表现。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html