-
Notifications
You must be signed in to change notification settings - Fork 1
StatefulWidget vs StatelessWidget
Seolin(Kirby) edited this page May 25, 2025
·
1 revision
목적: Flutter를 처음 접한 개발자가
StatelessWidget과StatefulWidget의 차이를 직접 체험하며 이해할 수 있도록, 한 페이지 안에서 실행 가능한 예제 코드와 자세한 설명을 제공합니다.
위 링크를 클릭하면 DartPad에서 코드를 바로 실행해 볼 수 있습니다.
| 위젯 | 상태 소유 주체 | 증가 방법 | 결과 |
|---|---|---|---|
| StatelessCounter | 상위 Playground 위젯 |
"부모 카운터 증가" 버튼 클릭 | 부모 상태가 변할 때만 숫자 업데이트 |
| StatefulCounter | 자신(_StatefulCounterState) |
각 위젯의 ➕ 아이콘 클릭 | 본인만 독립적으로 숫자 증가 |
✅ 핵심: Stateless 위젯은 자체 상태가 없고 외부에서 주입된 데이터 변화에 따라 다시 빌드됩니다. Stateful 위젯은 내부 상태를 보유하고
setState()로 UI를 직접 갱신할 수 있습니다.
Flutter 에서 UI 는 **위젯(Widget)**으로 구성됩니다. 위젯은 불변(immutable) 객체이며, UI 스냅샷을 기술합니다. UI에 변화가 필요할 때는 위젯 트리를 다시 구성(빌드)하여 새 위젯을 생성합니다. 이 과정은 선언형(Declarative) 패러다임으로 이해하면 쉽습니다.
StatelessWidget은 내부 상태가 없는 위젯입니다.
- 생성자에서 받은 인자에 의해 최초 빌드가 결정됩니다.
- 부모 위젯(혹은 상위 계층)의 상태 변화로 인한 새 위젯이 전달될 때만 다시 빌드됩니다.
class GreetingBanner extends StatelessWidget {
final String userName;
const GreetingBanner({super.key, required this.userName});
@override
Widget build(BuildContext context) {
return Text('안녕하세요, $userName님!');
}
}| 구분 | StatelessWidget 권장 사례 |
|---|---|
| UI 변동성 | 한 번 그려지면 변하지 않는 정적 화면 요소 |
| 데이터 소스 | 부모에서 전달된 값이 자주 바뀌지 않음 |
| 예시 | 로고, 아이콘, 불변 텍스트 라벨 |
StatefulWidget은 내부 상태를 가질 수 있는 위젯입니다.
- 상태 객체(
State<T>)가 분리되어 있으며, 해당 객체가setState()를 호출하면 위젯 트리 일부를 다시 빌드합니다. - 라이프사이클 메서드(
initState,dispose,didUpdateWidget등)를 제공하여 리소스 초기화·해제, 의존성 변경 대응이 가능합니다.
class CounterPage extends StatefulWidget {
const CounterPage({super.key});
@override
State<CounterPage> createState() => _CounterPageState();
}
class _CounterPageState extends State<CounterPage> {
int _count = 0;
void _increment() => setState(() => _count++);
@override
Widget build(BuildContext context) {
return Column(
children: [
Text('$_count'),
ElevatedButton(onPressed: _increment, child: const Text('Add')),
],
);
}
}| 구분 | StatefulWidget 권장 사례 |
|---|---|
| UI 변동성 | 사용자 상호작용에 따라 실시간으로 변경되는 화면 |
| 장기 리소스 | AnimationController, TextEditingController 등 |
| 예시 | 폼 입력, 애니메이션, 실시간 피드 |
| 항목 | StatelessWidget | StatefulWidget |
|---|---|---|
| 상태 보유 | ❌ | ✅ |
| 상태 변경 | 외부 데이터가 바뀔 때 새 인스턴스 생성 | 내부 setState() 호출 |
| 라이프사이클 | build() |
initState(), dispose() 등 |
| 장점 | 가볍고 예측 가능 | 동적 UI, 리소스 관리 |
| 단점 | 상태를 직접 변경 불가 | 약간 더 무거움 |
-
가능하면 Stateless 사용: 불필요한
StatefulWidget은 오버헤드. - const 생성자 활용: 변하지 않는 위젯 재사용.
- 위젯 분리: 대형 Stateful 대신 Stateless 하위 위젯 분리.
-
리소스 해제:
dispose()에서 컨트롤러·리소스 정리.