Flutter Stateful Widget 라이프 사이클 - 2. createState

플랙트·2021년 4월 1일
0
class Checkbox extends StatefulWidget {

	...(중략)

  
  _CheckboxState createState() => _CheckboxState();
}

class _CheckboxState extends State<Checkbox> with TickerProviderStateMixin {
  bool get enabled => widget.onChanged != null;
  Map<Type, Action<Intent>> _actionMap;

  
  void initState() {
  	...
  }
  ...(생략)
}

위 코드는 머터리얼 UI의 체크박스 위젯에서 createState 함수를 정의하는 부분이이다.

  
  _CheckboxState createState() => _CheckboxState();

@override 어노테이션은 상속 관계에서 부모 클래스의 멤버를 재정의하겠다고 컴파일러에게 알려주는 메타데이터이다. 실제로 체크박스 위젯의 부모 클래스인 Stateful Widget의 추상클래스 선언부로 이동해보면 다음과 같은 코드를 볼 수 있다.

abstract class StatefulWidget extends Widget {
  
  StatefulElement createElement() => StatefulElement(this);

  
  @factory
  State createState();
}

@protected annotaion의 경우 해당 멤버가 해당 클래스 내부, 자식 클래스, 구현 클래스, 믹스 클래스등에서만 사용되어질 수 있다는 것을 dart_analyzer에게 알려주는 역할이다. dart 언어 자체에는 protected keyword가 없으므로 meta package에 annotaion으로 구현되어 있다. 덕분에 dart analyzer에서 체크가 가능하다.

  
  _CheckboxState createState() => _CheckboxState();

다시 createState의 선언부를 보면, 람다 표현식으로 작성되어 있으며 CheckboxState라는 State 클래스의 생성자를 호출하고 있다. 이 _createState()는 state 클래스를 생성하는 생성자이다. 체크박스 위젯의 상태 클래스에는 현재 별도의 생성자가 선언되어 있지 않기 때문에, 클래스 명으로 생성자를 호출하면 그것이 기본 생성자이다. 물론 생성자를 커스텀하여 선언할 수있으며, 생상자를 통해 상태 클랫의 멤버를 초기화할 수 있다.

createState 함수는 flutter framework에 의해 호출되며, 위젯트리의 위젯과 상태 클래스를 연결한다. 위젯 클래스 자체는 다시 빌드 될 때, 사라졌다가 다시 생성된다. 하지만 상태 클래스는 해당 위젯이 dispose상태가 되기 전까지는 사라지지 않는다. 또한 같은 계층에 같은 타입의 statue widget이 여러개 있을때, 각 위젯의 상태 클래스가 어떤 것인지 구분할수 없을 수 있는데 이때 Key를 활용한다.

createState에서 중요한 부분이 하나 더 있다. 바로 Key의 존재이다. flutter는 같은 위젯이 같은 위젯 아래, 같은 계층에 여러개 있을때, 해당 위젯들의 state가 각각 어떤 위젯에 해당되느 것인지 알 수 없다. 그래서 key를 활용한다. 위젯에 globalKey와 같은 key가 할당되어 있으면 해당 문제를 다룰 수 있다.

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

0개의 댓글