You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter Web加载完成后隐藏启动页需监听什么JavaScript事件

Flutter Web监听应用初始化完成移除加载指示器的实现方案

window.onload仅会在页面静态资源(包括main.dart.js文件本身)下载完成时触发,此时Flutter引擎还未完成初始化、Dart业务代码还在执行、应用首帧也未渲染,因此会提前触发不符合需求,你可以使用以下两种官方支持的方案实现需求:


方案1:修改Flutter加载器链式回调(最稳定,推荐)

Flutter 2.0及以上版本的index.html默认使用官方提供的_flutter.loader加载流程,你可以在runApp执行完成的回调中处理加载指示器的移除:

window.addEventListener('load', function(ev) {
  _flutter.loader.loadEntrypoint({
    serviceWorker: {
      serviceWorkerVersion: serviceWorkerVersion,
    }
  })
  .then(function(engineInitializer) {
    return engineInitializer.initializeEngine();
  })
  .then(function(appRunner) {
    return appRunner.runApp();
  })
  .then(function() {
    // 此时Flutter应用首帧已渲染完成,可安全移除加载指示器
    const spinner = document.querySelector('.spinner');
    if (spinner) spinner.remove();
  });
});

方案2:监听Flutter全局自定义事件

如果你不想修改默认的加载流程代码,可以直接监听Flutter初始化完成后自动触发的flutter:app-initialized全局事件:

// 直接写在index.html的任意<script>标签中即可
window.addEventListener('flutter:app-initialized', () => {
  const spinner = document.querySelector('.spinner');
  if (spinner) spinner.remove();
});

该事件的触发时机和方案1完全一致,都是在Flutter应用首帧渲染完成后触发。


兼容低版本Flutter(1.x版本)的方案

如果你使用的是不支持上述特性的旧版Flutter,可以通过监听Flutter渲染根元素插入DOM的时机实现:

const observer = new MutationObserver((mutations) => {
  // Flutter渲染的根元素标签为flt-glass-pane,该元素插入页面代表首帧已渲染
  if (document.querySelector('flt-glass-pane')) {
    const spinner = document.querySelector('.spinner');
    if (spinner) spinner.remove();
    observer.disconnect();
  }
});
// 监听body下的DOM节点变化
observer.observe(document.body, { childList: true, subtree: true });

内容的提问来源于stack exchange,提问作者Hashem Aboonajmi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 04:54:03