HarmonyOS鸿蒙Next中使用router跳转页面出现白屏

HarmonyOS鸿蒙Next中使用router跳转页面出现白屏 使用router跳转页面,如何是首次跳转,会出现白屏闪一下再进入相应的页面,如何页面跳转过就不会出现这样的问题。这是什么原因?该如何解决?

cke_1261.png


更多关于HarmonyOS鸿蒙Next中使用router跳转页面出现白屏的实战教程也可以访问 https://www.itying.com/category-93-b0.html

7 回复

页面首次跳转会出现短暂白屏,可能和页面初始化耗时有关。

例如进入应用某个页面,发起了网络请求,需等待数据请求完成,在请求完成前,页面一直显示空白内容。这种情况建议提前加载好网络数据,避免网络请求导致的耗时。或者在数据未完全加载之前占位页面,参考骨架屏展示代码示例。

如果要访问的是Web页面,当Web页面加载缓慢时,可以使用预连接、预加载加速Web页面的访问。

可以通过prepareForPageLoad()来预解析或者预连接将要加载的页面,Ability的onCreate中提前初始化Web内核并对首页进行预连接,示例代码如下:

// xxx.ets
import { webview } from '@kit.ArkWeb';
import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';

export default class EntryAbility extends UIAbility {
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
    console.info("EntryAbility onCreate");
    webview.WebviewController.initializeWebEngine();
    // 预连接时,需要將'https://www.example.com'替换成真实要访问的网站地址。
    webview.WebviewController.prepareForPageLoad("https://www.example.com/", true, 2);
    AppStorage.setOrCreate("abilityWant", want);
    console.info("EntryAbility onCreate done");
  }
}

如果仍有问题。为了更快解决您的问题,请尽量补全以下信息:

1.复现代码(最小复现demo);

2.版本信息(如:开发工具、手机系统版本信息);

更多关于HarmonyOS鸿蒙Next中使用router跳转页面出现白屏的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


1.router 在首次加载目标页面时,需要进行 页面资源初始化(布局渲染、样式加载、逻辑初始化),这个过程会比二次进入耗时更长,就会有一个瞬间的白屏。

2.页面渲染机制:ArkUI 的渲染是异步的,页面构建树需要时间生成,首帧之前会出现空白。

页面/资源过大,如果目标页面包含较多组件、图片资源或初始化逻辑,首次进入时就容易出现白屏,缺少转场动画或占位 UI,楼主可以考虑增加骨架屏或者加载动画

参考文档:[@system.router (页面路由)-已停止维护的接口-ArkTS API-ArkUI(方舟UI框架)-应用框架 - 华为HarmonyOS开发者](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-system-router#routerpush)

可能有以下问题导致

1.资源文件过大导致首次加载耗时过长

首次跳转目标页面时,页面初始化或资源加载需要时间,若未添加转场动画或加载占位逻辑,系统默认直接渲染空白页,导致短暂白屏。

2.未正确配置页面过渡动画

router跳转若未通过pageTransition声明页面入场/退场动画,系统会直接切换页面,首次加载时因资源未缓存,白屏现象更明显。

3.页面栈管理缺陷

首次跳转时页面栈未初始化完成,可能导致渲染延迟(如目标页面的@Entry修饰符未正确声明或模块类型配置错误)。

可以尝试以下方案

//在目标页面中通过pageTransition声明入场动画,覆盖默认无动画的切换效果:

// 目标页代码中声明动画
[@Entry](/user/Entry)
@Component
struct TargetPage {
  @State message: string = 'Hello World'

  // 定义页面转场动画
  pageTransition() {
    PageTransitionEnter({ duration: 200 })
      .slide(SlideEffect.Right) // 从右侧滑入
    PageTransitionExit({ duration: 200 })
      .slide(SlideEffect.Left)  // 向左滑出
  }

  build() {
    Column() {
      Text(this.message)
    }
  }
}

解决方案

1/添加转场动画优化视觉体验,通过设置入场/退场动画平滑过渡,避免直接切换产生白屏。

// 添加页面转场动画

pageTransition() {

  PageTransitionEnter({ duration: 300 })

    .slide(SlideEffect.Right)

  PageTransitionExit({ duration: 300 })

    .slide(SlideEffect.Left)

}

2/在目标页面的module.json5中确认配置,错误的"feature"类型会导致跳转异常

{

  "module": {

    "name": "your_module",

    "type": "har", // 为har或shared

    "routerMap": [{

      "name": "target_page",

      "pageSourceFile": "pages/TargetPage"

    }]

  }

}

3/延迟跳转

通过setTimeout给予页面初始化缓冲时间

setTimeout(() => {

  router.pushUrl({ url: 'pages/TargetPage' })

}, 100) // 延迟100ms触发跳转

或者通过bindContentCover覆盖式跳转

bindContentCover($$this.contentCoverState, (event?: ContentCoverDismissEvent) => {

  // 跳转逻辑

})

4/在应用启动阶段提前初始化Web组件内核:

onCreate() {

  // 提前初始化浏览器内核

  WebView.preloadEngine()

}

最好还是使用Navigation组件管理页面栈,其内置优化机制可减少白屏概率:

Navigation.bindNavDestination(this)

Navigation.navigateTo({ route: 'TargetPage' })

原因分析

  • 首次跳转白屏:通常是因为目标页面首次加载时需要执行初始化(如资源加载、数据请求、组件渲染等),导致渲染延迟。第二次跳转时,页面可能已被缓存或部分资源已预加载,因此不再出现白屏。
  • 具体因素:可能包括:
    • 页面生命周期(如aboutToAppearonPageShow)中包含耗时操作。
    • 如果目标页面包含Web组件,Web内核初始化、网络请求或渲染模式可能导致白屏。
    • 页面布局复杂或数据未就位,导致渲染阻塞。

解决方案

1. 使用预加载或缓存机制

  • 预加载页面:在跳转前预加载目标页面,减少首次加载时间。例如,使用NodeContainer在后台渲染页面。
// 示例:在父页面预加载子页面
import { NodeContainer } from '@kit.ArkUI';
// 在适当时机预加载目标页面
NodeContainer.loadPage('pages/TargetPage');
  • 预加载数据:如果页面依赖网络数据,可提前下载并缓存数据。

2. 使用条件渲染和骨架图

  • 在目标页面中,使用条件渲染先显示骨架图,等数据就绪后再显示真实内容,提升用户体验。
// 在目标页面中
@State isInitialized: boolean = false;

build() {
  Column() {
    if (!this.isInitialized) {
      // 显示骨架图
      SkeletonComponent();
    } else {
      // 显示真实内容
      RealContentComponent();
    }
  }
}

3. 优化Web组件(如果目标页面包含Web组件)

  • 设置Web组件背景色与网页背景色一致,避免闪烁。
Web({ src: ' https://example.com ', controller: this.controller })
  .backgroundColor(Color.Gray) // 根据网页背景色设置
  • 检查网络权限和渲染模式,确保Web组件正常加载。
// module.json5中添加网络权限
"requestPermissions": [
  { "name": "ohos.permission.INTERNET" }
]

4. 使用Navigation组件代替router

  • Navigation组件提供更灵活的页面管理和转场动画,支持预加载和单实例模式,可能减少白屏。
// 使用Navigation进行跳转
this.pageStack.pushPath({ name: 'TargetPage' });

5. 检查页面生命周期

  • 避免在aboutToAppearonPageShow中执行耗时操作(如同步网络请求),改为异步或提前执行。

总结

首次跳转白屏问题可通过预加载、骨架图、Web组件优化或使用Navigation组件来缓解。如果问题仍存在,请检查目标页面的具体实现(如耗时操作)。

HarmonyOS Next中使用router跳转页面白屏通常由以下原因导致:

  1. 目标页面未在module.json5中正确注册路由路径
  2. 页面组件未正确定义或导出
  3. 页面资源未正确加载
  4. 路由路径拼写错误或参数格式不正确

检查目标页面的路由配置和组件定义,确保路径与代码中的跳转路径完全匹配。

在HarmonyOS Next中,首次使用router跳转页面时出现白屏,通常是由于页面初始化或资源加载延迟导致的。首次跳转时,目标页面可能尚未预加载,系统需要时间渲染组件和资源,因此会出现短暂白屏。后续跳转因页面已缓存,不再出现此问题。

解决方案:

  1. 预加载目标页面:在应用启动或合适时机提前加载可能跳转的页面,减少首次渲染时间。
  2. 使用Splash Screen:在页面加载过程中显示占位界面,提升用户体验。
  3. 优化资源加载:检查目标页面的资源(如图片、样式)是否过大,进行压缩或异步加载。
  4. 检查路由配置:确保路由定义正确,避免不必要的重定向或嵌套问题。

通过预加载或优化资源策略,可有效减少白屏现象。

回到顶部