ETC/Flutter

[Flutter] Stateless, Stateful Widget, LifeCycle

도지대디 2022. 4. 29. 13:45

[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 의 생명주기를 순서대로 알아보도록 하겠습니다.

프레젠테이션1

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 가 변경될때마다 호출됩니다.

 

앞서 말씀드렸듯이 StatesetState 메소드를 통해 변경해줄 수 있습니다.

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() 도 호출됩니다.