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
相关产品推荐
相关产品推荐

