[Flutter] StatefulWidget Lifecycle

2023. 1. 3. 00:44IT/Flutter

SMALL

 

1. createState()

State 객체를 생성한다. 

State란 StatefulWidget의 내부 상태와 로직이다. 

즉, StatefulWidget은 State 객체를 생성하고 자신의 상태와 로직을 관리시킨다.

 

2.  mounted = true

일단 State 객체를 생성하면,  initState()가 호출되기 전에 해당 객체를 BuildContext와 연관시키고 mounted 상태를 true로 변경한다.

mounted = true 상태는 State객체가 트리에 올라간 상태를 뜻한다.

이러한 BuildContext와의 연관은 영구적이며, State 객체는 절대 연관된 BuildContext 다른것으로 바꾸지 않는다.

 

3. initState()

각 State객체가 생성될때 단 한번만 호출된다. 처음 초기화가 필요하다면 initState 메서드를 오버라이드 해서 사용할 수 있다.

 

4. didChangeDependencies()

initState() 바로 다음에 호출되며, State 객체의 dependency가 변경될때 호출된다.

 

5. build()

Widget에 정의된 UI를 실제로 그리는 메서드이다. 

  • initState가 호출된 다음에
  • didUpdateWidget이 호출된 다음에
  • setState 호출을 받은 다음에
  • State object의 dependency가 변경된 다음에 (예를들면, 이전 빌드에서 참조했던 InheritedWidget이 변경되었을때)
  • deactive가 호출되고 그 다음 State 객체를 트리의 다른 위치에 다시 삽입할때

호출 된다.

 

6. didUpdateWidget()

위젯 구성이 변경될때마다 호출된다.

부모위젯이 변경되거나 runtimeType과 Widget.key가 같은 새로운 widget을 업데이트해서 보여주려고 할때 호출된다. 

 

7. setState()

Framework에게 현재 상태가 'dirty' 상태라고 알려준다. 'dirty' 상태란 UI 에 영향을 미칠정도로 변경이 일어났다는것을 의미한다.

이 'dirty' 상태 이후에 build() 메서드가 다시 호출되어 update 또는 rebuild를 한다.

 

8. deactivate()

State객체가 Widget tree에서 제거될때 호출된다. 다만 State객체는 트리의 다른곳에 재삽입 되는경우가 있는데, 이런경우에는 재삽입 후 acitvate() 메서드가 호출되고 다시 build()가 호출된다.

 

9. dispose()

State객체가 Widget tree에서 영구적으로 제거되었을때 호출된다. 

 

10. mounted = false

dispose() 메서드 이후에 호출되고 현재 State객체가 tree에 있지 않음을 나타낸다.

 

 

각 Lifecycle과 여러 구성요소들의 설명의 경우 공식문서 또는 comment에 더욱 자세하게 설명되어 있으니 한번쯤 참고하면 좋을 듯 하다.

LIST