프로그래밍/flutter

Stateful Widget Lifecycle (위젯 생명주기)

인썸니아 2021. 12. 6. 00:02

안드로이드 코틀린 프로그래밍에서의 Activity Lifecycle 처럼 플러터에서도 위젯의 생명주기가 있다. 플러터에서는 크게 Stateless Widget, Stateful Widget 두 가지가 존재하는데, Stateless 위젯의 경우 한 번 만들어지면 갱신하지 않으므로 따로 생명주기라는게 없다. 따라서 플러터에서 생명주기라 함은 곧 Stateful Widget의 생명주기라고 할 수 있겠다.

Stateful widget 은 또 StatefulWidget 클래스와 State 클래스로 구분되어 있는데, 화면 갱신 등의 실제 동작은 State 클래스에서 이루어지므로 Stateful Widget 생명주기는 또한 State 클래스의 생명주기라고 해도 될 것 같다.

 

1. createState()

Stateful 위젯이 호출되면 StatefulWidget 클래스에서 createState() 함수가 호출되게 된다.

class LifeCycle extends StatefulWidget {
  const LifeCycle({Key? key}) : super(key: key);

  @override
  State<LifeCycle> createState() => _LifeCycleState();
}

 

2. mounted == true

createState() 함수가 호출되어 State 객체가 생성되고 buildContext가 할당되면 mounted 속성이 true가 된다. mounted 가 false일 때 setState() 함수를 호출하면 오류가 발생한다. 안전한 setState() 동작을 위해 아래처럼 사용하기도 한다.

if(mounted) {
  setState(() {
    ...
  });
}

 

3. initState()

위젯 생성시 호출되는 함수로 한번만 호출된다. 데이터 초기화 등을 수행하면 된다.

 

4. didChangeDependencies()

위젯이 최초 생성될 때 initState() 직후 호출되고, 위젯이 의존하는 데이터의 객체가 호출될 때 호출된다. 이 함수에 대해서는 아직 정확하게 이해하지 못한 상태인데, 아마, 예를들어 Cloud Firestore DB 를 사용하는 경우에 stream data 가 변경되어 화면이 자동 update 될 때 호출되지 않을까?? 이건 좀 테스트 해 봐야 할 것 같다.

 

5. build()

위젯을 렌더링하여 화면에 그리는 함수. 뭔가 변경될 때 마다 호출되니 가장 많이 호출되는 함수일 듯. setState() 함수를 사용할 때 마다 호출된다.

 

6. didUpdateWidget(Widget oldWidget)

부모 위젯으로 인해 이 위젯을 rebuild 해야 하는 경우 호출된다. 부모 위젯의 변경으로 애니메이션을 재실행 한다던가 어떤 동작을 수행해야 할 때 사용할 수 있다.

@override
void didUpdateWidget(Widget oldWidget) {
  super.didUpdateWidget(oldWidget);
  if (widget.value != oldWidget.value) {
    // TODO: start a transition between the previous and new value
  }
}

 

7. setState()

데이터가 변경되어 화면이 업데이트 되어야 함을 프레임워크에 알리기 위해 주로 개발자가 호출하는 함수이다. 플러터 프레임워크 내부적으로 어떻게 로직이 흘러가는지 정확히 이해하고 사용할 수 있어야 하겠다.  setState() 함수가 호출되면 화면 업데이트를 위해 build() 함수가 이어서 호출된다.

 

8. deactivate()

State 객체가 위젯 트리에서 제거될 때 호출되는 함수이다. 기본적으로 사용될 일이 별로 없을 것 같은데, GlobalKey를 사용하여 현재 위젯을 위젯 트리의 특정 위치로 이동시키게 되면, 해당 위젯의 State 객체가 제거되었다 추가되는 것이므로 deactivate() 함수를 사용할 수 있다.

 

9. dispose()

State 객체가 위젯 트리에서 영구히 제거될 때 호출되며, deactivate() 함수 다음에 호출된다. 위젯의 사용을 종료할 때 실행해야 할 코드들을 여기서 실행시키면 된다.

 

10. mounted == false

State 객체가 소멸하고 mounted 가 false 가 되면 더이상 State를 사용할 수 없다. mounted 가 false 일땐 setState() 를 호출할 수 없다.

반응형