블로그로 돌아가기

[Flutter] 기본 흰 화면(White Flash) 제거하기 - flutter_native_splash 완벽 가이드

(수정됨: 2026년 3월 10일)

Flutter 기본 흰 화면(White Flash) 제거하기

Flutter 앱을 실행하면 커스텀 스플래시 화면이 나오기 전에 흰 화면이 잠깐 번쩍하는 걸 본 적 있을 겁니다. 이건 Flutter 엔진이 로딩되는 동안 OS가 보여주는 네이티브 스플래시 화면인데, 기본값이 흰색이라 눈에 거슬립니다.

이 글에서는 flutter_native_splash 패키지로 이 문제를 해결하는 방법을 정리합니다.

왜 흰 화면이 보이는가?

Flutter 앱의 실행 흐름은 다음과 같습니다:

TEXT
앱 실행 → [네이티브 스플래시] → Flutter 엔진 로딩 → [Flutter 위젯 렌더링]

Flutter 엔진이 로딩되기 에는 Dart 코드가 실행될 수 없기 때문에, OS가 네이티브 레벨에서 정적 화면을 보여줍니다. 이게 Android의 launch_background.xml, iOS의 LaunchScreen.storyboard입니다.

기본값이 흰 배경이라, 커스텀 스플래시가 어두운 색이면 흰색 → 커스텀 스플래시 전환이 눈에 띄게 됩니다.

해결 방법

1. 패키지 설치

Bash
flutter pub add flutter_native_splash

2. pubspec.yaml 설정

flutter: 섹션 위에 설정을 추가합니다.

YAML
flutter_native_splash:
  color: "#009CCC"              # 배경색 (커스텀 스플래시와 비슷한 색)
  image: assets/images/logo.png # 중앙에 표시할 로고 (선택사항)
  android: true
  ios: true

flutter:
  uses-material-design: true
  # ...

Tip: 커스텀 스플래시가 그라데이션이라면 중간색을 배경색으로 설정하면 전환이 자연스럽습니다.

3. 네이티브 스플래시 생성

Bash
dart run flutter_native_splash:create

이 명령어가 Android/iOS 네이티브 파일들을 자동으로 수정합니다:

  • Android: launch_background.xml, styles.xml
  • iOS: LaunchScreen.storyboard, Assets.xcassets

4. main.dart 수정 - 스플래시 유지

핵심은 preserve()입니다. 이걸 호출하면 Flutter 엔진이 준비되어도 네이티브 스플래시가 사라지지 않고 유지됩니다.

Dart
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()에서 네이티브 스플래시를 제거합니다.

Dart
import 'package:flutter_native_splash/flutter_native_splash.dart';

class _SplashScreenState extends State<SplashScreen> {
  
  void initState() {
    super.initState();

    // 네이티브 스플래시 제거 → Flutter 스플래시가 보이기 시작
    FlutterNativeSplash.remove();

    // 서버 체크, 인증 확인 등 비즈니스 로직...
    _checkServerAndAuth();
  }
}

최종 실행 흐름

TEXT
앱 실행
  → 네이티브 스플래시 (#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 하나로 깔끔하게 해결됩니다. 핵심은 세 줄입니다:

Dart
// main()에서 유지
FlutterNativeSplash.preserve(widgetsBinding: widgetsBinding);

// 스플래시 화면에서 제거
FlutterNativeSplash.remove();

네이티브 스플래시 배경색만 앱 테마에 맞추면, 사용자는 흰 화면 없이 자연스러운 앱 시작 경험을 하게 됩니다.

댓글