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

4 回复

优先用真机测试,模拟器有时候会有一些问题

更多关于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秒钟切换到下一个页面。当启动画面隐藏时,清除计时器。

  1. setInterval方法中,没有使用箭头函数,导致this指向错误。
  2. setInterval方法应该在组件的生命周期方法中调用,而不是直接在组件内部定义。
  3. router对象未定义,需要导入或创建。
  4. CommonConstants对象未定义,需要导入或创建。
  5. AdvertiseIconSkipButtonCopyrightComponent等组件未定义,需要导入或创建。
  6. $r函数未定义,需要导入或创建。
  7. AlignmentHorizontalAlign等枚举值未定义,需要导入或创建。
  8. ImageColumnStack等组件未定义,需要导入或创建。
  9. 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或在页面跳转前手动调用相关处理逻辑。

回到顶部