Flutter 생명주기 완벽 이해: 위젯의 생성부터 소멸까지 한눈에 정리

Flutter 생명주기란 무엇인가?

**Flutter 생명주기(Lifecycle)**란, 앱 실행 중 위젯이 생성되고 사라지기까지의 전 과정을 의미합니다.
즉, Flutter 프레임워크가 화면에 위젯을 렌더링하고 상태를 관리하는 일련의 단계죠.
이 개념을 정확히 이해하면 불필요한 리빌드(rebuild)를 줄이고, 성능 최적화에도 큰 도움이 됩니다.


StatelessWidget의 생명주기

StatelessWidget은 이름 그대로 상태(State)가 없는 위젯입니다.
한 번 생성되면 변경되지 않으며, 다음 단계만 거칩니다.

  1. build() → 화면 렌더링
  2. 이후 상태 변경 불가

예를 들어, 단순한 텍스트나 아이콘 같은 고정 UI에 적합합니다.

class HelloText extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Text('Hello Flutter!');
  }
}

StatefulWidget의 생명주기

StatefulWidget은 상태가 변할 수 있는 위젯입니다.
이 위젯은 State 객체를 가지며, 다음과 같은 생명주기 단계를 거칩니다.

createState()

State 객체를 생성합니다. 위젯이 처음 화면에 등장할 때 한 번만 호출됩니다.

initState()

초기화 로직을 처리합니다. 예를 들어, API 요청이나 컨트롤러 초기화 등을 수행합니다.

super.initState()는 반드시 호출해야 합니다.

build()

UI를 렌더링하는 단계입니다. 상태가 변경되면 이 메서드가 다시 호출되어 화면을 갱신합니다.

didUpdateWidget()

부모 위젯이 변경되었을 때 호출되어, 위젯 상태를 새로 동기화합니다.

deactivate()

위젯이 위젯 트리에서 제거되기 전에 호출됩니다.

dispose()

리소스 해제 단계입니다. Controller, Stream 등을 정리해야 메모리 누수를 방지할 수 있습니다.

class CounterWidget extends StatefulWidget {
  @override
  State<CounterWidget> createState() => _CounterWidgetState();
}

class _CounterWidgetState extends State<CounterWidget> {
  int _count = 0;

  @override
  void initState() {
    super.initState();
    print('initState 호출!');
  }

  @override
  Widget build(BuildContext context) {
    return ElevatedButton(
      onPressed: () => setState(() => _count++),
      child: Text('$_count'),
    );
  }

  @override
  void dispose() {
    print('dispose 호출!');
    super.dispose();
  }
}

Flutter 생명주기의 활용 포인트

initState() : API 호출, 초기 데이터 로딩
build() : 상태 변경 시 UI 업데이트
dispose() : 리소스 정리, 메모리 관리
didChangeAppLifecycleState() : 앱의 포그라운드/백그라운드 상태 감지

예를 들어, 아래처럼 WidgetsBindingObserver를 통해 앱 전체 생명주기를 감시할 수도 있습니다.

class AppLifecycleObserver extends State<MyApp> with WidgetsBindingObserver {
  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addObserver(this);
  }

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    print('현재 앱 상태: $state');
  }

  @override
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    super.dispose();
  }
}

정리: Flutter 생명주기를 알면 코드가 달라진다

Flutter 생명주기는 단순히 위젯이 만들어지고 사라지는 과정이 아닙니다.
앱 성능, 리소스 효율성, 상태 관리의 핵심이 되는 로직입니다.
초보 개발자라면 initState → build → dispose 순서를 명확히 익히는 것부터 시작해보세요.
이 구조를 이해하면 상태 관리 패턴(Provider, BLoC, Riverpod) 도 훨씬 자연스럽게 익힐 수 있습니다.


결론

Flutter 생명주기는 앱의 안정성과 성능을 결정짓는 핵심 개념입니다.
위젯의 생성부터 소멸까지의 흐름을 정확히 이해하면, Flutter 개발의 효율성과 유지보수성이 극대화됩니다.
지금 바로 자신의 코드에서 initState, build, dispose가 어떻게 작동하는지 점검해보세요.

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

위로 스크롤