📖 目录
- flutter_native_splash 启动页配置
- flutter_launcher_icons 应用图标配置
- change_app_package_name 包名修改
- 常见问题速查
- 最佳实践与自动化脚本
flutter_native_splash 启动页配置
📌 基本介绍
<font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">flutter_native_splash</font> 用于自定义 Flutter 应用启动时的原生启动页。从点击应用图标到 Flutter 框架初始化完成之间,会显示这个启动页。
⚠️ 核心注意事项(经验总结)
1. Android 12+ 的特殊处理
❗最重要的问题:Android 12+ 使用全新的 SplashScreen API,原生不支持 **<font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">background_image</font>** 全屏背景图,只支持"背景色 + 居中圆形图标"的设计规范。
如果你坚持需要全屏背景图,需要在每次生成后手动修改配置文件:
yaml1
2
3
4
5
| # pubspec.yaml 配置
flutter_native_splash:
android: true
android_12:
background_image: assets/images/splash.png # 配置全屏背景
|
手动修复步骤(必须!):
bash1
2
3
4
5
| # 1. 生成启动页配置
dart run flutter_native_splash:create
# 2. 编辑 android/app/src/main/res/values-v31/style.xml
# 在 LaunchTheme 中添加关键行:
|
xml1
2
3
4
5
6
7
8
| <style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar">
<!-- ⚠️ 必须添加这一行!否则 Android 12+ 会白屏 -->
<item name="android:windowBackground">@drawable/launch_background</item>
<item name="android:forceDarkAllowed">false</item>
<item name="android:windowFullscreen">false</item>
<!-- ... 其他配置 -->
</style>
|
2. Android 图片资源分布说明(常见误解)
✅正常现象:使用 <font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">background_image</font> 或 <font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">image</font> 配置后,插件会自动生成多分辨率适配的图片,不会全部放在 **<font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">drawable</font>** 目录下。
textandroid/app/src/main/res/
├── drawable-hdpi/
│ └── splash.png # 高分辨率设备
├── drawable-mdpi/
│ └── splash.png # 中分辨率设备
├── drawable-xhdpi/
│ └── splash.png # 超高分辨率设备
├── drawable-xxhdpi/
│ └── splash.png # 超超高分辨率设备
└── drawable/
└── launch_background.xml # 配置文件,引用 @drawable/splash
💡说明:<font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">drawable</font> 目录下看不到 <font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">splash.png</font> 是完全正常的,因为图片按分辨率分散在各个目录中,Android 系统会自动选择合适的版本。
3. iOS 的稳定实现方案
✅经验总结:iOS 上 <font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">color + image</font> 使用的是 <font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">LaunchScreen.storyboard</font> 的标准实现,比直接使用 <font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">background_image</font> 更稳定。
yaml1
2
3
4
5
6
| # iOS 推荐配置(经过验证的稳定方案)
flutter_native_splash:
ios: true
color: "#42a5f5" # 背景色作为后备(防止黑屏)
image: assets/images/splash.png
ios_content_mode: scaleAspectFill # 图片全屏显示
|
💡为什么这个方案更好:
- 安全性:即使图片加载失败,也会显示背景色,不会黑屏
- 效果:
<font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">scaleAspectFill</font> 效果等同于全屏背景图 - 兼容性:使用系统的标准实现,与 iOS 版本无关
4. Android 图片拉伸控制
yaml1
2
3
4
5
6
7
8
9
| flutter_native_splash:
android: true
android_gravity: fill # 关键参数:让图片填满屏幕
# 可选值说明:
# - fill: 填满屏幕(可能变形)
# - center: 居中显示(可能有留白)
# - center_crop: 居中裁剪填满(推荐)
# - fill_horizontal: 水平填满
# - fill_vertical: 垂直填满
|
📝 完整配置示例(经过验证)
yaml1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| flutter_native_splash:
web: false
# iOS 配置(稳定方案)
ios: true
color: "#42a5f5"
image: assets/images/splash.png
ios_content_mode: scaleAspectFill
# Android 配置
android: true
android_gravity: fill
# Android 12+ 全屏(需要手动修复)
android_12:
background_image: assets/images/splash.png
# ⚠️ 重要提醒:每次生成后必须手动在 values-v31/style.xml 添加:
# <item name="android:windowBackground">@drawable/launch_background</item>
|
🔧 常用命令
bash1
2
3
4
5
6
7
8
9
10
| # 创建启动页
dart run flutter_native_splash:create
# 移除启动页
dart run flutter_native_splash:remove
# 清理并重新生成(解决大部分问题)
flutter clean
dart run flutter_native_splash:remove
dart run flutter_native_splash:create
|
flutter_launcher_icons 应用图标配置
📌 基本配置
yaml1
2
3
4
5
6
7
8
9
| flutter_launcher_icons:
android: true
ios: true
image_path: "assets/images/logo.png"
# 自适应图标(Android 8.0+ 推荐)
adaptive_icon_background: "#FFFFFF" # 或图片路径
adaptive_icon_foreground: "assets/images/logo_foreground.png"
# iOS 去背景(避免黑底)
remove_alpha_ios: true
|
⚠️ 注意事项
1. 图片尺寸要求
- Android:提供 192x192px 的图标即可,插件自动生成各种尺寸
- iOS:需要 1024x1024px(App Store 要求)
2. Android 自适应图标
yaml1
2
3
4
5
6
7
8
| flutter_launcher_icons:
android: true
# 方案一:简单配置(自动处理背景)
image_path: "assets/images/logo.png"
# 方案二:自适应图标(推荐,避免变形)
adaptive_icon_background: "#FFFFFF"
adaptive_icon_foreground: "assets/images/logo_foreground.png"
|
经验:如果 logo 有透明背景,强烈建议使用自适应图标配置,避免在某些设备上显示异常。
3. iOS 图标去背景
yaml1
2
3
4
| flutter_launcher_icons:
ios: true
image_path: "assets/images/logo.png"
remove_alpha_ios: true # 移除透明背景,避免出现黑底
|
🔧 命令
bash1
2
3
4
5
6
| # 生成图标
dart run flutter_launcher_icons
# 如果图标不更新,先清理
flutter clean
dart run flutter_launcher_icons
|
change_app_package_name 包名修改
📌 基本用法
bash1
2
| # 修改 Android 包名
dart run change_app_package_name:main com.yourcompany.appname
|
⚠️ 重要注意事项
1. 影响范围
- 只修改 Android:这个工具只修改 Android 的包名
- iOS 需要手动:Bundle Identifier 需要自己在 Xcode 中修改
2. 修改后的完整流程
bash1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| # 1. 修改 Android 包名
dart run change_app_package_name:main com.xata.newapp
# 2. 手动修改 iOS Bundle Identifier
# 用 Xcode 打开 ios/Runner.xcworkspace
# General → Identity → Bundle Identifier
# 3. 清理项目
flutter clean
rm -rf ios/Pods ios/Podfile.lock
# 4. 重新获取依赖
flutter pub get
cd ios && pod install && cd ..
# 5. 更新第三方服务配置(如使用 Firebase)
# - 重新下载 google-services.json 放到 android/app/
# - 重新下载 GoogleService-Info.plist 放到 ios/Runner/
|
常见问题速查
🚨 flutter_native_splash
| 问题现象 | 可能原因 | 解决方案 | | — | — | — | | Android 12+ 白屏 | values-v31/style.xml 缺少关键配置 | 手动添加 <font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);"><item name="android:windowBackground">@drawable/launch_background</item></font> | | iOS 黑屏 | 使用了不稳定的 <font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">background_image</font> | 改用 <font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">color + image + scaleAspectFill</font> | | Android 图片找不到 | 误解了资源分布 | 检查 <font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">drawable-hdpi</font>
等目录,<font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">drawable</font>
目录下没有是正常的 | | 图片显示不全或有留白 | <font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">android_gravity</font>
设置不当 | 添加 <font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">android_gravity: fill</font>
或 <font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">android_gravity: center_crop</font> | | 启动页一闪而过 | 正常现象 | 如果需要在启动页停留更久,使用 <font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">preserve()</font>
方法 |
🚨 flutter_launcher_icons
| 问题现象 | 可能原因 | 解决方案 | | — | — | — | | 图标有黑底(iOS) | 透明背景未处理 | 添加 <font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">remove_alpha_ios: true</font> | | 图标变形(Android) | 未使用自适应图标 | 配置 <font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">adaptive_icon_background</font>
和 <font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">adaptive_icon_foreground</font> | | 图标不更新 | 缓存问题 | 执行 <font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">flutter clean</font>
后重新生成 |
🚨 change_app_package_name
| 问题现象 | 可能原因 | 解决方案 | | — | — | — | | iOS 包名未变 | 工具只修改 Android | 手动在 Xcode 中修改 Bundle Identifier | | Firebase 服务失效 | 配置文件不匹配 | 重新下载对应包名的配置文件 | | 编译失败 | 缓存未清理 | 执行 <font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">flutter clean</font>
后重试 |
最佳实践与自动化脚本
📋 执行顺序建议
bash1
2
3
4
5
| # 新项目初始化顺序
1. dart run change_app_package_name:main com.company.appname # 先改包名
2. dart run flutter_launcher_icons # 再生成图标
3. dart run flutter_native_splash:create # 最后生成启动页
4. # 手动修复 Android 12+(如果需要)
|
🤖 自动化脚本(推荐)
创建 <font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">setup_splash.sh</font> 文件:
bash1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
| #!/bin/bash
# Flutter 启动页配置自动化脚本
echo "🚀 开始配置 Flutter 启动页..."
# 1. 生成启动页
dart run flutter_native_splash:create
# 2. 检查并修复 Android 12+ 配置
STYLES_FILE="android/app/src/main/res/values-v31/style.xml"
if [ -f "$STYLES_FILE" ]; then
# 检查是否已经包含 windowBackground
if ! grep -q "android:windowBackground" "$STYLES_FILE"; then
# 备份原文件
cp "$STYLES_FILE" "${STYLES_FILE}.bak"
# 添加缺失的配置(兼容 macOS 和 Linux)
if [[ "$OSTYPE" == "darwin"* ]]; then
# macOS
sed -i '' '/<style name="LaunchTheme"/,/<\/style>/s/<item name="android:forceDarkAllowed">/<item name="android:windowBackground">@drawable\/launch_background<\/item>\n &/' "$STYLES_FILE"
else
# Linux
sed -i '/<style name="LaunchTheme"/,/<\/style>/s/<item name="android:forceDarkAllowed">/<item name="android:windowBackground">@drawable\/launch_background<\/item>\n &/' "$STYLES_FILE"
fi
echo "✅ 已添加 Android 12+ 启动页修复"
else
echo "✅ Android 12+ 配置已完整"
fi
fi
# 3. 验证生成的文件
echo "📁 生成的图片资源:"
ls -la android/app/src/main/res/drawable-*/splash.png 2>/dev/null || echo "⚠️ 请检查图片是否生成"
echo "🎉 启动页配置完成!"
|
使用方法: bash1
2
| chmod +x setup_splash.sh
./setup_splash.sh
|
📝 项目 README 模板
markdown1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| ## 🎨 启动页配置说明
### Android 12+ 特殊处理
每次运行 `dart run flutter_native_splash:create` 后,需要手动添加:
- 文件:`android/app/src/main/res/values-v31/style.xml`
- 在 `LaunchTheme` 中添加:
`<item name="android:windowBackground">@drawable/launch_background</item>`
### 自动化脚本
运行 `./setup_splash.sh` 可自动完成生成和修复。
### 验证清单
- [ ] iOS 启动页正常显示(背景色 + 全屏图片)
- [ ] Android 低版本启动页正常显示(全屏图片)
- [ ] Android 12+ 启动页正常显示(需手动修复)
|