이 시리즈 에서는 플러터에서 기본 제공하는 머터리얼 위젯에 포함되어있는 대표적인 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에서 알아야할 부분을 요약해 보면 아래와 같다.
일단 예제 코드를 살펴보자. 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과 같은 것들을 초기화하는 것이 이에 해당된다.