개발일기

Flutter 생명주기 완전 정리: initState부터 dispose까지

뱅우 2025. 6. 1. 12:18
반응형

안드로이드 개발자라면 onCreate(), onResume(), onDestroy() 같은 생명주기 메서드에 익숙할 겁니다.
하지만 Flutter에서는 위젯 중심의 생명주기 개념이 완전히 다릅니다.
특히 StatefulWidget일 때 위젯이 어떻게 생성되고, 업데이트되고, 제거되는지 이해하는 것이 핵심입니다.


🧱 StatelessWidget은 생명주기가 없다?

StatelessWidget은 상태 변화가 없기 때문에, build() 외에는 특별한 생명주기 메서드가 없습니다.
정적인 화면을 구성할 때 주로 사용되며, 렌더링 한 번으로 끝납니다.


🔄 StatefulWidget의 생명주기 흐름

StatefulWidget의 전체 흐름은 아래와 같습니다:

  1. createState()
  2. initState()
  3. didChangeDependencies()
  4. build()
  5. didUpdateWidget() (위젯 변경 시)
  6. deactivate()
  7. dispose()

🔍 각 메서드 설명

1️⃣ initState()

위젯이 처음 생성될 때 딱 한 번 호출됩니다. API 호출, Controller 생성 등 초기 설정 작업에 사용합니다.


@override
void initState() {
  super.initState();
  print("initState 호출됨");
}

2️⃣ didChangeDependencies()

InheritedWidget이나 Provider 같은 의존성 데이터가 바뀔 때 호출됩니다.
initState 다음 호출되며, context 사용이 가능합니다.

3️⃣ build()

UI를 그리는 곳입니다. setState() 호출 시마다 재실행됩니다.
화면의 모습은 이 메서드의 반환값에 따라 결정됩니다.

4️⃣ didUpdateWidget()

부모 위젯이 현재 위젯을 재빌드할 때 호출됩니다.
예: MyWidget(title: "A")MyWidget(title: "B") 로 변경된 경우

5️⃣ deactivate()

위젯이 위젯 트리에서 제거될 때 호출됩니다. (UI에서는 사라지지만, 메모리엔 남아 있음)

6️⃣ dispose()

위젯이 완전히 제거될 때 호출됩니다. Controller, Animation, Stream 등 해제 작업을 여기에 작성합니다.


@override
void dispose() {
  myController.dispose();
  super.dispose();
}

📊 요약: Android vs Flutter 생명주기 비교

Android Flutter (StatefulWidget)
onCreate() initState()
onStart(), onResume() didChangeDependencies()
onDestroy() dispose()
setContentView() build()

💡 실제 디버깅 팁

다음 코드처럼 각 생명주기에 print를 넣어 보면, 위젯이 언제 다시 그려지는지 쉽게 알 수 있습니다.


@override
void initState() {
  print("initState()");
  super.initState();
}

@override
void build(BuildContext context) {
  print("build()");
  return Text('Hello');
}

@override
void dispose() {
  print("dispose()");
  super.dispose();
}

🔚 마무리

Flutter 생명주기는 Android와 달리 UI 중심이 아닌 상태 중심입니다.
StatefulWidget을 제대로 다루기 위해서는 생명주기를 이해하고 활용하는 것이 필수입니다.


반응형