Flutter Stateful Widget 라이프 사이클 - 3. initState

플랙트·2021년 4월 3일
0

이 시리즈 에서는 플러터에서 기본 제공하는 머터리얼 위젯에 포함되어있는 대표적인 StatefulWidget인 체크박스 위젯을 통해 플러터 개발자가 꼭 알아야할 StatefulWidget LifeCycle에 대해서 알아본다. 이번시간에는 initState에 대하여 알아보자.

체크박스 위젯의 initState부분은 아래와 같다.

  
  void initState() {
    super.initState();
    _actionMap = <Type, Action<Intent>>{
      ActivateIntent: CallbackAction<ActivateIntent>(onInvoke: _actionHandler),
    };
  }

  void _actionHandler(ActivateIntent intent) {
    if (widget.onChanged != null) {
      switch (widget.value) {
        case false:
          widget.onChanged(true);
          break;
        case true:
          widget.onChanged(widget.tristate ? null : false);
          break;
        default: // case null:
          widget.onChanged(false);
          break;
      }
    }
    final RenderObject renderObject = context.findRenderObject();
    renderObject.sendSemanticsEvent(const TapSemanticEvent());
  }

initState에서 알아야할 부분을 요약해 보면 아래와 같다.

  1. initState는 Widget의 LifeCycle동안 오직 1번만 수행된다.
  2. initState의 수행이 완료되지 않았더라도 build 함수가 호출 될 수 있다.
  3. initState 자체는 async 함수가 될 수 없다.
  4. initState 에서도 BuildContext를 사용할 수 있다.

일단 예제 코드를 살펴보자. initSate의 선언부는 다음과 같다.

  
  void initState() {
    super.initState();
    _actionMap = <Type, Action<Intent>>{
      ActivateIntent: CallbackAction<ActivateIntent>(onInvoke: _actionHandler),
    };
  }

@override annotaion으로 미루어보아 initState는 부모 클래스의 함수를 override하는 것임을 알 수 있다. super.initState()는 부모 클래스의 initState() 메소드를 호출한다. 이는 부모 클래스의 initState()에 @mustCallSuper annotation이 있으므로 반드시 호출해 주어야 한다. 내용을 보면 그냥 위젯 lifeCycle의 상태가 created인지 assert로 호가인하고 있다.

추상클래스인 부모 위젯 (State)의 initState 부분 주석을 보면 initState의 역할이 잘 나와 있다.

정확히 initState는 해당 위젯의 위젯 트리에 삽입되어질 때, 1번 호출되는 메서드이다. 따라서 해당 위젯의 설정이나 트리 내 위치 정보인 BuildContext에 따라 결정되어지는 초기화를 할 때 사용한다.

대표적인 예로 ChangeNotifier나 Stream과 같은 것들을 초기화하는 것이 이에 해당된다.

profile
유용한 서비스에 관심이 많은 flutter 개발자입니다.

0개의 댓글