HarmonyOS 鸿蒙Next @Entry @Component 装饰的组件,在执行 router.replaceUrl 后有时会不执行 onPageHide
HarmonyOS 鸿蒙Next @Entry @Component 装饰的组件,在执行 router.replaceUrl 后有时会不执行 onPageHide
[@Entry](/user/Entry)
[@Component](/user/Component)
struct SplashScreenPage {
@State pageShowTime: number = CommonConstants.TIME_DEFAULT_VALUE;
@State intervalID: number = CommonConstants.INTERVAL_ID_DEFAULT;
build() {
Column() {
Stack({ alignContent: Alignment.TopStart }) {
Image($r('app.media.ic_splash_page_background'))
.width(CommonConstants.IMAGE_WIDTH)
.height(CommonConstants.IMAGE_HEIGHT)
AdvertiseIcon()
SkipButton({ secondsCount: (CommonConstants.DELAY_SECONDS - this.pageShowTime) })
}
.layoutWeight(CommonConstants.STACK_LAYOUT_WEIGHT)
.width(CommonConstants.STACK_WIDTH)
CopyrightComponent()
}
.alignItems(HorizontalAlign.Start)
.width(CommonConstants.COLUMN_WIDTH)
.height(CommonConstants.COLUMN_HEIGHT)
}
/**
* When the SplashScreenPage is displayed, switch to the next page after 3 seconds.
*/
onPageShow() {
this.intervalID = setInterval(() => {
this.pageShowTime += CommonConstants.INCREMENT_VALUE;
if (this.pageShowTime > CommonConstants.DELAY_SECONDS) {
router.replaceUrl({
url: CommonConstants.MAIN_PAGE_URL
});
}
}, CommonConstants.INTERVAL_DELAY);
}
/**
* When the SplashScreenPage is hide, clear interval.
*/
onPageHide() {
clearInterval(this.intervalID);
}
}
新建的 SplashAbility 模板中,在执行 router.replaceUrl 后有时会不执行 onPageHide,具体的规律没有找到,没有改动相关代码,但有时候会调用,有时候不调用。导致了后续会不断地执行 router.replaceUrl.请问这是我少了什么步骤吗?
DevEco Studio 3.1.1 Release 本地模拟器(Phone) API 9
更多关于HarmonyOS 鸿蒙Next @Entry @Component 装饰的组件,在执行 router.replaceUrl 后有时会不执行 onPageHide的实战教程也可以访问 https://www.itying.com/category-93-b0.html
优先用真机测试,模拟器有时候会有一些问题
更多关于HarmonyOS 鸿蒙Next @Entry @Component 装饰的组件,在执行 router.replaceUrl 后有时会不执行 onPageHide的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
将clear方法写在aboutToDisappear方法中
aboutToDisappear(){
console.error("SplashScreenPage: aboutToDisappear")
clearInterval(this.intervalID);
}
这段代码是一个名为SplashScreenPage
的Flutter组件,它用于显示一个启动画面。在这个组件中,有一个计时器,当启动画面显示时,每隔3秒钟切换到下一个页面。当启动画面隐藏时,清除计时器。
- 在
setInterval
方法中,没有使用箭头函数,导致this
指向错误。 setInterval
方法应该在组件的生命周期方法中调用,而不是直接在组件内部定义。router
对象未定义,需要导入或创建。CommonConstants
对象未定义,需要导入或创建。AdvertiseIcon
、SkipButton
、CopyrightComponent
等组件未定义,需要导入或创建。$r
函数未定义,需要导入或创建。Alignment
、HorizontalAlign
等枚举值未定义,需要导入或创建。Image
、Column
、Stack
等组件未定义,需要导入或创建。router.replaceUrl
方法未定义,需要导入或创建。
更正后的代码:
import 'package:flutter/material.dart';
import 'package:your_project/router.dart';
import 'package:your_project/constants.dart';
import 'package:your_project/components/advertise_icon.dart';
import 'package:your_project/components/copyright_component.dart';
import 'package:your_project/components/skip_button.dart';
@Entry
@Component
class SplashScreenPage extends StatefulWidget {
@override
_SplashScreenPageState createState() => _SplashScreenPageState();
}
class _SplashScreenPageState extends State<SplashScreenPage> {
int pageShowTime = CommonConstants.TIME_DEFAULT_VALUE;
int intervalID = CommonConstants.INTERVAL_ID_DEFAULT;
@override
void initState() {
super.initState();
setInterval();
}
@override
void dispose() {
super.dispose();
onPageHide();
}
setInterval() {
intervalID = Timer.periodic(Duration(seconds: CommonConstants.INTERVAL_DELAY), (Timer t) {
setState(() {
pageShowTime += CommonConstants.INCREMENT_VALUE;
if (pageShowTime > CommonConstants.DELAY_SECONDS) {
router.replaceUrl({
url: CommonConstants.MAIN_PAGE_URL,
});
}
});
});
}
onPageHide() {
Timer.cancel(intervalID);
}
@override
Widget build(BuildContext context) {
return Column(
children: [
Stack(
alignment: Alignment.topStart,
children: [
Image.asset('app.media.ic_splash_page_background')
.width(CommonConstants.IMAGE_WIDTH)
.height(CommonConstants.IMAGE_HEIGHT),
AdvertiseIcon(),
SkipButton(secondsCount: (CommonConstants.DELAY_SECONDS - pageShowTime)),
],
),
SizedBox(height: CommonConstants.STACK_LAYOUT_WEIGHT),
Container(
width: CommonConstants.STACK_WIDTH,
height: CommonConstants.COLUMN_HEIGHT,
child: Column(
children: [
CopyrightComponent(),
],
),
),
],
);
}
}
在HarmonyOS中,使用@Entry
和@Component
装饰的组件在执行router.replaceUrl
后,onPageHide
有时可能不会被触发。这是由于页面替换操作不会触发目标页面的onPageHide
生命周期回调。onPageHide
通常在当前页面被覆盖(如跳转到新页面)时触发,但router.replaceUrl
会直接替换当前页面,因此不会触发onPageHide
。如果需要在此场景下执行特定逻辑,可以考虑使用onBackPress
或在页面跳转前手动调用相关处理逻辑。