[Flutter] 위젯과 앱의 생명주기

Angela Jeong·2024년 4월 23일
post-thumbnail

생명주기란?

생명주기란, 어떤 객체나 시스템이 생성, 활성화, 사용, 그리고 비활성화되고 소멸되는 과정이다.

앱의 경우로 생각해보면, 사용자가 앱을 실행하고 화면에 표시되는 시작 단계부터 앱이 완전히 종료되는 단계까지의 과정이 생명주기가 될 것이다!

Flutter를 구성하는 중요한 요소가 위젯이기 때문에 (👉 Flutter 위젯이란?) Flutter에서는 앱 뿐만 아니라 위젯의 생명주기가 앱의 생명주기에 대해서도 잘 이해해야한다:)

위젯의 생명주기는 앱의 생명주기에 종속되지만 앱의 생명주기가 변경되더라도 위젯의 생명주기는 그대로 유지될 수 있기 때문이다.



위젯의 생명주기

Stateless widget

  • Stateless widget은 상태가 없는 위젯이지만 정확히 얘기하면 상태가 한 번 생성되면 절대 바뀌지않는다.
  • 따라서 라이프 사이클은 매우 간단한데, Stateless widget이 build 될 때마다 build method가 호출되고, 이 build method 내에서 사용자가 원하는 내용의 stateless widget을 새롭게 생성한다.

Stateful widget

화면구축

1. 생성 createState()

  • statefulWidget을 구축하자마자 호출되며 필수 메서드이다.
  • 연결된 State의 인스턴스를 반환한다.
  • 위젯 트리에 상태를 만들기 위해 호출된다.

2. 초기화 initState()

  • 위젯 트리 초기화를 한다.
  • 단 한 번만 호출된다.
  1. didChangeDependencies()
  • 위젯이 최초 생성될때 initState 다음에 바로 호출 된다.
  • state 객체의 종속성이 변경될 때 호출된다.
  • initState뒤에 호출되지만 그 이외에도 호출된다.


재 드로잉

4. build()

  • 위젯으로 만든 UI를 구축한다.
  • 다양한 곳에서 반복적으로 호출된다.
  • 변경된 부분 트리를 감지하고 대체한다.

5. didUpdateWidget()

  • 위젯의 구성이 변경될 때마다 호출된다.
  • 부모 위젯이 변경되어 위젯을 다시 그려야 할 때 호출된다. (다음 데이터를 제공하기 위해!)
  • build() 메서드가 Stream이나 변경 가능한 데이터에 의존적인 경우 이전 객체에서 구독을 취소하고 didUpdateWidget()에서 새로운 인스턴스에 다시 구독 해야한다.

6. setStat

  • 상태가 변경되었을 때 프레임워크에 상태가 변경됨을 알린다.


화면 파기

7. deactivate()

  • state 트리로부터 제거될때마다 호출되는데 거의 사용되지 않는다.

8. dispose()

  • 객체가 트리에서 영구적으로 제거된다.


앱의 생명주기

앱이 사용되는 동안의 상태이며 앱의 생명주기는 앱이 시작되고 종료될 때까지의 전체 수명이다.

  1. resumed (Foreground)
  • 앱이 포그라운드로 돌아가서 유저 input에 반응한다.
  • 최초 앱 실행때는 해당 이벤트가 발생하지 않는데, 일시 중지된 앱이 다시 포그라운드로 이동하고 실행되는 것으로 보면 된다.
  1. inactive (Foreground)
  • 앱이 foreground에 있으나 비활성 상태이며 사용자의 input을 받을 수 없는 상태
    ex) 전화통화 할때, 다른 앱으로 스위치할 때
  1. Hidden (Background)
  • 앱이 일시 중지 되려고 할 때 발생
  • 앱이 계속 실행되고있으며 백그라운드에서 작업을 수행할 수 있다.
  1. Paused (Background)
  • 앱이 일시 중지되었으며 유저에게 ui가 보이지 않는 상태다.
  • 보이진 않지만 백그라운드에서는 돌아가고 있다.
    ex) 앱이 최소화되거나, 홈 버튼으로 이동하거나, 다른 앱으로 전환하는 경우
  1. detached
  • 앱이 전혀 동작하지 않는 상태다.
  • 앱이 꺼지기 직전에 실행된다.
    ex) 앱을 완전히 끄거나, 디바이스를 끄는 상태

실제 예시로 생각해본다면, 만약 유저가 백그라운드로 들어갔을 때 타이머를 멈춰야 하는 앱을 구성하는 경우 반드시 추가 로직이 필요할 것이다. 앱의 생명주기를 보면 백그라운드 상태에서도 앱이 동작하기 때문!

*출처:
https://dev.to/pranjal-barnwal/the-journey-of-a-widget-understanding-the-lifecycle-in-flutter-3plp
https://api.flutter.dev/flutter/widgets/AppLifecycleListener-class.html

0개의 댓글