Flutter에서 상태 관리는 단순히 setState()만 알면 끝날까요?
UI가 언제 다시 그려지고, 리소스는 언제 정리되는지 알지 못한다면, 앱은 예상치 못한 동작을 하게 됩니다.
이번 글에서는 StatefulWidget이 앱 안에서 어떻게 생성되고,
어떤 과정을 거쳐 화면에 표시되며,
마지막에 어떻게 정리되는지를 전체 흐름으로 살펴보겠습니다.
StatefulWidget의 생명주기란?
StatefulWidget은 내부 상태(state)의 변화에 따라build()가 다시 실행되고 UI가 갱신되는 구조입니다.
그런데, 이 build가 언제 다시 실행되는지,
또 dispose()는 정확히 언제 불리는지 명확하게 아시나요?
Flutter는 위젯을 효율적으로 다시 그리기 위해 Dirty / Clean 상태로 나누고,
정해진 생명주기 메서드를 순차적으로 호출합니다.
이 흐름을 알면 setState()의 타이밍은 물론,
리소스 누수나 예상 못한 상태 꼬임을 예방할 수 있어요.
StatefulWidget 생명주기 요약표
| 메서드 | 설명 | 호출 시점 |
|---|---|---|
createState() |
연결된 State 객체 생성 | 위젯 최초 생성 시 |
initState() |
상태 초기화 로직 수행 | 트리에 삽입 직후 단 1회 |
didChangeDependencies() |
종속성 변경 감지 | initState() 직후, 또는 InheritedWidget 변경 시 |
build() |
UI 구성 | Dirty 상태일 때마다 호출 |
setState() |
상태 변경 트리거 | 호출 즉시 Dirty 마킹 |
didUpdateWidget() |
부모 위젯으로부터 새 인스턴스를 수신 | 기존 State 유지됨 |
deactivate() |
트리에서 제거되기 직전 | 재삽입 가능성 있음 |
dispose() |
영구 제거 직전 호출 | 리소스 해제 처리 시점 |
🔁 생명주기 흐름 다이어그램
아래는 Flutter에서 StatefulWidget이 생성 → 갱신 → 제거까지
어떻게 순차적으로 흐르는지를 시각화한 그림입니다.

🔍 흐름 해설 – 3단계로 나눠보기
1. Creation (생성 단계)
| 메서드 | 역할 |
|---|---|
createState() |
상태 객체를 생성합니다 |
initState() |
상태 초기화, 컨트롤러 생성 등 |
didChangeDependencies() |
의존하는 상위 데이터 변경 감지 |
2. Update Cycle (UI 갱신 단계)
| 메서드 | 역할 |
|---|---|
setState() |
Dirty 마킹 후 다음 프레임에 build() 호출 |
build() |
현재 상태에 따라 UI 갱신 |
didUpdateWidget() |
부모 위젯에서 새로운 인스턴스가 전달됨 |
3. Disposal (제거 단계)
| 메서드 | 역할 |
|---|---|
deactivate() |
위젯이 트리에서 분리되기 직전 호출 |
dispose() |
위젯이 완전히 제거될 때, 리소스 정리 필요 |
🧠 Dirty vs Clean 상태란?
Flutter는 전체 위젯 트리를 매 프레임마다 다시 그리지 않습니다.
대신 "Dirty 상태"로 표시된 위젯만 선별해 build()를 다시 호출하죠.
| 개념 | 정의 |
|---|---|
| Dirty 상태 | setState() 호출 직후. build() 재실행 필요 |
| Clean 상태 | UI가 최신 상태로 유지됨. 빌드 불필요 |
💡 setState()를 부르면 Dirty로 바뀌고,
다음 프레임에서 build()가 실행된 후
다시 Clean 상태로 돌아갑니다.
📌 실무에서 주의할 점
initState()는 1회만 실행되므로, 초기화할 리소스는 여기에!didChangeDependencies()는 context로부터 상위 데이터를 받을 때 유용합니다.dispose()에서는 컨트롤러나 스트림, Timer 등 반드시 해제하세요.didUpdateWidget()은 부모 위젯이 재빌드될 때 상태를 유지하면서 내부 데이터를 갱신할 수 있는 기회입니다.
📚 다음 글 예고
다음 글부터는
상태를 변경하는 핵심 메서드
setState()를 중심으로,
UI가 어떻게 바뀌는지,
어떤 구조로 짜야
깔끔하게 동작하는지를
실습과 함께 따라가 볼 예정입니다.
작은 상태 변화부터 시작해,
실무에서 흔히 마주치는 예제들까지
단계적으로 다룰 예정이니
끝까지 따라와 주세요!
'개발(Development) > Flutter' 카테고리의 다른 글
| Flutter 앱은 어떻게 시작될까? (4) | 2025.08.06 |
|---|---|
| 상태관리 시리즈 1 - Stateless와 Stateful 완전 정복 (2) | 2025.08.05 |
| Navigation 시리즈 002 - AlertDialog, 다이얼로그의 기본 익히기 (2) | 2025.08.05 |
| Navigation 시리즈 001 - Navigator 1.0 화면 전환과 데이터 전달의 모든 것 (3) | 2025.08.01 |
| Flutter 위젯 시리즈 007 – Scaffold와 AppBar 완전 이해하기 (0) | 2025.07.14 |
| Flutter 위젯 시리즈 006 – Container 완전 이해하기 (1) | 2025.07.14 |
| Flutter 위젯 시리즈 005 – Row 완전 이해하기 (2) | 2025.07.11 |
| Flutter 위젯 시리즈 004 – ElevatedButton 완전 정복 (1) | 2025.07.09 |