[Flutter] 기본 흰 화면(White Flash) 제거하기 - flutter_native_splash 완벽 가이드
Flutter 기본 흰 화면(White Flash) 제거하기
Flutter 앱을 실행하면 커스텀 스플래시 화면이 나오기 전에 흰 화면이 잠깐 번쩍하는 걸 본 적 있을 겁니다. 이건 Flutter 엔진이 로딩되는 동안 OS가 보여주는 네이티브 스플래시 화면인데, 기본값이 흰색이라 눈에 거슬립니다.
이 글에서는 flutter_native_splash 패키지로 이 문제를 해결하는 방법을 정리합니다.
왜 흰 화면이 보이는가?
Flutter 앱의 실행 흐름은 다음과 같습니다:
앱 실행 → [네이티브 스플래시] → Flutter 엔진 로딩 → [Flutter 위젯 렌더링]
Flutter 엔진이 로딩되기 전에는 Dart 코드가 실행될 수 없기 때문에, OS가 네이티브 레벨에서 정적 화면을 보여줍니다. 이게 Android의 launch_background.xml, iOS의 LaunchScreen.storyboard입니다.
기본값이 흰 배경이라, 커스텀 스플래시가 어두운 색이면 흰색 → 커스텀 스플래시 전환이 눈에 띄게 됩니다.
해결 방법
1. 패키지 설치
flutter pub add flutter_native_splash
2. pubspec.yaml 설정
flutter: 섹션 위에 설정을 추가합니다.
flutter_native_splash:
color: "#009CCC" # 배경색 (커스텀 스플래시와 비슷한 색)
image: assets/images/logo.png # 중앙에 표시할 로고 (선택사항)
android: true
ios: true
flutter:
uses-material-design: true
# ...
Tip: 커스텀 스플래시가 그라데이션이라면 중간색을 배경색으로 설정하면 전환이 자연스럽습니다.
3. 네이티브 스플래시 생성
dart run flutter_native_splash:create
이 명령어가 Android/iOS 네이티브 파일들을 자동으로 수정합니다:
- Android:
launch_background.xml,styles.xml - iOS:
LaunchScreen.storyboard,Assets.xcassets
4. main.dart 수정 - 스플래시 유지
핵심은 preserve()입니다. 이걸 호출하면 Flutter 엔진이 준비되어도 네이티브 스플래시가 사라지지 않고 유지됩니다.
import 'package:flutter_native_splash/flutter_native_splash.dart';
Future<void> main() async {
// Flutter 바인드 준비 + 네이티브 스플래시 유지
WidgetsBinding widgetsBinding = WidgetsFlutterBinding.ensureInitialized();
FlutterNativeSplash.preserve(widgetsBinding: widgetsBinding);
// Firebase, SDK 초기화 등...
await Firebase.initializeApp();
runApp(MyApp());
}
5. 스플래시 화면에서 제거
커스텀 Flutter 스플래시 위젯의 initState()에서 네이티브 스플래시를 제거합니다.
import 'package:flutter_native_splash/flutter_native_splash.dart';
class _SplashScreenState extends State<SplashScreen> {
void initState() {
super.initState();
// 네이티브 스플래시 제거 → Flutter 스플래시가 보이기 시작
FlutterNativeSplash.remove();
// 서버 체크, 인증 확인 등 비즈니스 로직...
_checkServerAndAuth();
}
}
최종 실행 흐름
앱 실행
→ 네이티브 스플래시 (#009CCC + 로고) ← 흰 화면 대신!
→ Flutter 엔진 로딩 (네이티브 스플래시 계속 유지)
→ Flutter 스플래시 위젯 initState() 실행
→ FlutterNativeSplash.remove() 호출
→ 커스텀 스플래시 (그라데이션 + 애니메이션)
→ 메인 화면
네이티브 스플래시 vs Flutter 스플래시
| 네이티브 스플래시 | Flutter 스플래시 | |
|---|---|---|
| 실행 시점 | Flutter 엔진 로딩 전 | Flutter 엔진 로딩 후 |
| 구현 | OS 레벨 (XML, Storyboard) | Dart 위젯 |
| 그라데이션 | 불가 | 가능 |
| 애니메이션 | 불가 | 가능 |
| 비즈니스 로직 | 불가 | 가능 (API 호출, 인증 등) |
| 커스텀 폰트 | 불가 | 가능 |
주의사항
flutter_native_splash는 그라데이션을 지원하지 않습니다. 단색 배경만 가능합니다.preserve()후remove()를 반드시 호출해야 합니다. 안 하면 스플래시가 영원히 남습니다.- 네이티브 스플래시에서 서버 체크, Firebase 인증 같은 Dart 로직은 실행할 수 없습니다.
- 설정 변경 후에는
dart run flutter_native_splash:create를 다시 실행해야 합니다. - iOS 시뮬레이터에서는 캐시 때문에 변경이 안 보일 수 있습니다. 앱 삭제 후 재설치하면 됩니다.
정리
Flutter의 흰 화면 문제는 flutter_native_splash 하나로 깔끔하게 해결됩니다. 핵심은 세 줄입니다:
// main()에서 유지
FlutterNativeSplash.preserve(widgetsBinding: widgetsBinding);
// 스플래시 화면에서 제거
FlutterNativeSplash.remove();
네이티브 스플래시 배경색만 앱 테마에 맞추면, 사용자는 흰 화면 없이 자연스러운 앱 시작 경험을 하게 됩니다.