[Flutter] runApp()과 main() 함수

ds-k.dev·2025년 1월 10일
0

Flutter 깊게 보기

목록 보기
3/4

main()

  1. 역할: Flutter 앱의 진입점(entry point)으로, Dart 프로그램이 실행되면 가장 먼저 호출
  2. 구성: 보통 앱 초기화 코드(예: 종속성 주입, 설정 로드, 환경 초기화 등)를 포함
void main() {
	// 종속성 주입, 환경 초기화 등의 코드
	WidgetsFlutterBinding.ensureInitialized();
    	await Firebase.initializeApp(
    options: DefaultFirebaseOptions.currentPlatform,
  	);

  runApp(MyApp()); 
}

runApp()

  1. 역할: Flutter 프레임워크에 애플리케이션의 루트 위젯(root widget)을 전달하고, 위젯 트리를 화면에 렌더링하는 역할
  2. 구성: MaterialApp이나 CupertinoApp과 같은 위젯을 루트로 전달하는 것이 일반적
runApp(MyApp()); 
// 최상위 위젯을 전달함. 보통 MaterialApp이나 CupertinoApp

runApp() 좀 더 깊게 살펴보기

void runApp(Widget app) {
  final WidgetsBinding binding = WidgetsFlutterBinding.ensureInitialized();
  _runWidget(binding.wrapWithDefaultView(app), binding, 'runApp');
}

WidgetsFlutterBinding.ensureInitialized();

WidgetsFlutterBinding은 Flutter의 엔진과 프레임워크를 연결하는 클래스. ensureInitialized() 메서드를 통해 초기화.

  • firebase를 연결하면 firebase 초기화 전에 이 함수로 미리 연결을 해 주어야 하는 이유
  • firebase.initializeApp()은 firebase를 초기화 하기 위해 네이티브 코드를 호출한다.
  • 미리 바인딩을 안해주면(runApp()에서 바인딩을 하면) 네이티브 코드와 연결이 되어있지 않은 상태에서 초기화를 시도하기 때문에 오류 발생
  • 미리 바인딩을 해주고 -> firebase 초기화를 한다음 -> runApp() 실행

_runWidget()

  Future<void> _runWidget(Widget app, WidgetsBinding binding, String 	debugEntryPoint) {
  	assert(binding.debugCheckZone(debugEntryPoint));
  	binding
    	..scheduleAttachRootWidget(app)
    	..scheduleWarmUpFrame();
  }
  1. assert(binding.debugCheckZone(debugEntryPoint))
  • 디버그 모드에서 binding이 적절한 실행 컨텍스트(Zone) 내에서 동작하는지 확인
  • 문제 발생시 에러 던짐
  1. scheduleAttachRootWidget(app)
  • 루트 위젯(app)을 Flutter 프레임워크에 연결하는 작업을 예약
  • 내부적으로 루트 위젯을 RenderObjectToWidgetAdapter로 감싸서 렌더 트리와 연결
  1. scheduleWarmUpFrame()
  • 앱의 첫 번째 프레임을 렌더링하는 작업을 예약

0개의 댓글

관련 채용 정보