You need to enable JavaScript to run this app. Win32平台下如何在Flutter应用窗口创建前添加启动闪屏
优惠活动
大模型
产品
解决方案
定价
更多

Win32平台下如何在Flutter应用窗口创建前添加启动闪屏

Flutter Windows 自定义原生启动闪屏实现指南(基于win32_window层)

整体实现思路完全在Windows平台原生层完成,不侵入Dart侧业务逻辑,核心链路是:先于Flutter主窗口初始化弹出轻量无框闪屏,等主窗口完成引擎绑定、首帧渲染就绪后,自动关闭闪屏并展示主窗口。

核心实现步骤

1. 实现独立的轻量闪屏窗口

不需要依赖现有Win32Window类的完整能力,直接在main.cpp的入口函数最开头、主窗口创建逻辑之前插入闪屏创建代码:

  • 闪屏直接用最基础的Win32窗口实现,尺寸按需自定义(比如240x160的小巧尺寸)
  • 窗口样式设置为无标题栏、无边框,开启临时置顶属性,弹出时自动居中在屏幕位置
  • 直接加载项目本地资源文件中的闪屏图片,不需要引入额外第三方依赖
  • 闪屏创建完成后立即触发绘制,不阻塞后续的主窗口初始化流程

核心代码参考:

// 注册闪屏专用窗口类
WNDCLASSEXW splashCls = {0};
splashCls.cbSize = sizeof(WNDCLASSEXW);
splashCls.lpfnWndProc = DefWindowProc; // 无自定义交互逻辑,直接用系统默认窗口过程
splashCls.hInstance = GetModuleHandle(nullptr);
splashCls.lpszClassName = L"FlutterCustomSplash";
RegisterClassExW(&splashCls);

// 创建固定尺寸无框闪屏
int splashW = 240, splashH = 160;
HWND splashHwnd = CreateWindowExW(
    WS_EX_TOPMOST | WS_EX_TOOLWINDOW,
    splashCls.lpszClassName,
    L"",
    WS_POPUP,
    (GetSystemMetrics(SM_CXSCREEN) - splashW)/2,
    (GetSystemMetrics(SM_CYSCREEN) - splashH)/2,
    splashW, splashH,
    nullptr, nullptr, GetModuleHandle(nullptr), nullptr
);

// 加载嵌入的闪屏图片资源,IDB_SPLASH需提前在项目.rc资源文件中关联对应图片
HBITMAP splashImg = (HBITMAP)LoadImageW(
    GetModuleHandle(nullptr), MAKEINTRESOURCE(IDB_SPLASH),
    IMAGE_BITMAP, splashW, splashH, LR_DEFAULTCOLOR
);
SendMessage(splashHwnd, WM_SETICON, ICON_BIG, (LPARAM)splashImg);

// 直接显示闪屏,不做额外等待
ShowWindow(splashHwnd, SW_SHOW);
UpdateWindow(splashHwnd);

2. 对接主窗口就绪判断逻辑

  • 找到win32_window.cpp中CreateAndShow方法的代码逻辑,把原来主窗口创建完成后直接调用ShowWindow展示窗口的代码暂时注释掉,避免主窗口和闪屏重叠弹出
  • 在方法末尾、也就是Flutter引擎完成初始化、视图绑定完成、首帧渲染触发的回调位置,插入闪屏销毁、主窗口展示的逻辑
  • 因为闪屏和主窗口分属不同文件,跨文件获取闪屏句柄时,直接通过之前注册的窗口类名调用FindWindow即可,不需要额外维护全局变量

核心逻辑参考:

// 主窗口初始化完成后,先销毁闪屏
HWND splashHwnd = FindWindowW(L"FlutterCustomSplash", nullptr);
if (splashHwnd) {
    DestroyWindow(splashHwnd);
}
// 再展示主窗口
ShowWindow(this->window_handle(), SW_SHOW);

常见踩坑点说明

  • 不要给闪屏单独写独立的消息循环,直接复用main.cpp中已有的全局消息泵即可,否则会导致主窗口消息阻塞
  • 闪屏不需要处理拖拽、点击等用户交互,保持纯展示状态即可,减少不必要的窗口过程处理开销
  • 不要把闪屏的显示逻辑和业务初始化逻辑绑定,闪屏仅用于覆盖原生层启动、Flutter引擎加载的空白等待时间,不要用闪屏承接网络请求、数据初始化这类耗时操作
  • 若需要给闪屏加简单的动画效果,直接在全局消息循环中注册毫秒级定时器触发重绘即可,不需要单独开工作线程,避免UI卡顿

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.23 12:06:00