[Flutter] Stateless, Stateful Widget, LifeCycle
Flutter 의 Lifecycle, 생명주기를 이해하기 위해서는 Stateless Widget 과 Stateful Widget 의 차이점을 알아야 합니다.
여기서 State
란 위젯의 상태를 의미합니다.
Stateless Widget
Stateless Widget 은 변경 가능한 State
가 필요하지 않은 Widget
을 뜻합니다.
다시 말해 Stateless Widget 도 State
를 가지긴 하지만, 한 번 생성된 이후에 변경될 일이 없는 값이라는 것입니다.
그렇다고 해서 Stateless Widget 이 전혀 변경되지 않는다는 것은 아닙니다. 상위 위젯이 전달해주는 값에 따라 Stateless Widget 의 값이 변경될 수도 있습니다.
Stateless Widget 이 빌드 될 때는 build 메소드가 호출됩니다. 그렇기 때문에 Stateful Widget 과는 다르게 다른 생명주기 메소드에 신경을 써줄 필요가 없습니다.
Stateful Widget
Stateful Widget 은 State
의 변화에 따라 빌드가 결정되는 위젯입니다. setState
메소드를 이용하면 State
의 값을 변경해줄 수 있습니다.
Stateful Widget 은 화면을 계속하여 그려주기 때문에 복잡한 생명주기를 가지고 있습니다.
LifeCycle
Stateful Widget 의 생명주기를 순서대로 알아보도록 하겠습니다.
0. constructor
Stateful Widget 이 빌드될 때 제일 처음 실행되는 것은 당연하게도 constructor
입니다.
하지만 constructor
가 실행될 때 위젯 속성은 비어있는 상태이기 때문에 생명주기의 일부분으로 취급되지는 않습니다.
1. createState()
constructor
가 실행된 후 곧바로 createState()
가 호출됩니다.
이 메소드는 말 그대로 State
객체를 생성하며, 이 State
객체 내에서는 변경 가능한 모든 State
를 관리할 수 있습니다.
2. initState()
initState()
메소드는 State
객체가 최초 생성될 때 호출되는 메소드입니다. 해당 메소드는 한번만 호출됩니다.
initState()
메소드는 context
가 형성되기 전에 실행되기 때문에 해당 메소드에서는 BuildContext
를 사용할 수 없으니 주의하시길 바랍니다.
저는 initState()
메소드를 이용해 주로 http request 를 관리합니다. 서버에서 받아온 데이터를 즉각 setState
메소드를 이용해 화면에 표시 가능한 상태로 만들어줍니다.
3. didChangeDependencies()
initState()
가 호출된 이후에 호출되는 메소드입니다. initState()
는 State
객체가 생성될 때 최초 한번만 실행되지만 didChangeDependencies()
메소드는 말 그대로 해당 위젯이 의존하는 위젯이 변경되면 호출됩니다.
대표적인 예는 inheritedWidget
을 사용하는 경우라고들 하는데, 해당 부분에 대해서는 추후에 더 추가적으로 알아보도록 하겠습니다.
4. build()
build()
메소드는 바로 위젯을 그려주는 메소드입니다. build()
는 위젯을 그려주는 필수적인 역할을 하기 때문에 State
가 변경될때마다 호출됩니다.
앞서 말씀드렸듯이 State
는 setState
메소드를 통해 변경해줄 수 있습니다.
5. setState()
setState()
메소드는 State
를 변경해주는 메소드이며 State
객체의 상태가 변경될 때마다 프레임워크에 알려줍니다.
이 상태를 dirty
한 상태라고 하며 변경된 State
에 따라 UI 를 재구성하기 위해 build()
메소드가 호출되어 위젯이 다시 빌드됩니다.
6. didUpdateWidget()
didUpdateWidget()
메소드는 부모 위젯이 다시 빌드되어 해당 위젯을 다시 빌드해야하는 경우에 호출됩니다.
이 때 새 위젯과 비교해볼 수 있도록 이전 위젯을 인자로 받습니다.
7. deactivate()
State
객체가 제거될 때마다 호출됩니다.
어떤 경우에는 프레임워크가 제거된 State
객체를 트리의 다른 부분에 다시 삽입하기도 합니다. 이 경우 State
객체가 트리의 새로운 위치에 적응할 수 있는 기회를 주기 위헤 build()
를 호출합니다.
8. dispose()
State
객체가 영구적으로 제거될 때 호출됩니다.
State
객체 내에서 생성된 listener
들이나 timer
객체 등을 해제시켜줄 경우에 dispose()
메소드를 이용할 수 있습니다.
9. reassemble()
reassemble()
메소드는 hot reload 를 실행하면 호출됩니다. 이 때 당연히 build()
도 호출됩니다.