<스테이트풀 위젯의 생명주기 10단계>
위젯의 생명주기 요약
순서 | 생명주기 | 내용 |
1 | createState() | 처음 스테이트풀을 시작할 때 호출 |
2 | mounted == true | createState() 함수가 호출되면 mounted는 true |
3 | initState() | State에서 제일 먼서 실행되는 함수 State 생성 후 한 번만 호출 |
4 | didChangeDependencies() | initState() 호출 후에 호출되는 함수 |
5 | build() | 위젯을 렌더링하는 함수. 위젯을 반환 |
6 | didUpdateWidget() | 위젯을 변경해야 할 때 호출하는 함수 |
7 | setState() | 데이터가 변경되었음을 알리는 함수 변경된 데이터를 UI에 적용하기 위해 필요 |
8 | deactivate() | State가 제거될 때 호출 |
9 | dispose() | State가 완전히 제거되었을 때 호출 |
10 | mounted == false | 모든 프로세서가 종료된 후 mounted 가 false로 됨 |
1. 상태를 생성하는 createState() 함수
StatefulWidget 클래스를 상속받는 클래스는 createState() 함수를 호출해야 한다.
다른 생명주기 함수들이 포함된 State 클래스를 반환한다. (위젯의 상태를 생성하는 함수)
2. 위젯을 화면에 장착하면 mounted == true
createState() 함수가 호출되어 상태가 생성되면 곧바로 mounted 속성이 true로 변경된다. (buildContext 클래스에 접근할 수 있다는 의미)
buildContext가 활성되어야 비로소 setState() 함수를 이용할 수 있다.
3. 위젯을 초기화하는 initState() 함수
위젯을 초기화할 때 한 번만 호출한다. 주로 데이터 목록을 만들거나 처음 필요한 데이터을 주고 받을 때 호출한다.
initState() 함수를 호출할 때 내부에서 _getJsonData() 함수를 호출해 서버에서 받아온 데이터를 화면에 출력하게 만들 수 있다.
이 단계에서 데이터를 미리 준비해 놓는 것이 좋다.
4. 의존성이 변경되면 호출하는 didChangeDependencies() 함수
initState() 함수가 호출된 후에 이어서 바로 호출되는 함수이다.
데이터에 의존하는 위젯이라면 화면에 표시하기 전에 꼭 호출해야 한다. 주로 상속받은 위젯을 사용할 때 피상속자가 변경되면 호출한다.
5. 화면에 표시하는 build() 함수
Widget을 반환, 즉 화면에 렌더링한다.
6. 위젯을 갱신하는 didUpdateWidget() 함수
부모 위젯이나 데이터가 변경되어 위젯을 갱신해야 할 때 호출한다.
initState()에서 특정 이벤트에 의해 위젯이 변경되면 didUpdateWidget() 함수를 통해 위젯을 갱신할 수 있다.
initState() 함수는 위젯을 초기화할 때 한 번만 호출되므로 위젯이 변경되었을 때 이러한 함수가 필요하다.
7. 위젯의 상태를 갱신하는 setState() 함수
데이터가 변경되었다는 것을 알려주고 변경된 데이터를 이용해 화면의 UI를 변경할 수 있도록 한다.
제일 많이 호출하는 함수이다.
8. 위젯의 상태 관리를 중지하는 deactivate() 함수
State 객체가 플러터의 구성 트리로부터 제거될 때 호출된다.
deactivate() 함수가 호출되더라도 dispose() 함수를 호출하기 전까지는 State 객체를 재사용할 수 있다.
9. 위젯의 상태 관리를 완전히 끝내는 dispose() 함수
State 객체를 영구적으로 소멸할 때 호출한다. (해당 위젯을 종료한다는 뜻)
위젯을 소멸할 때 꼭 호출해야 하는 함수람녀 dispose() 함수 안에서 호출해야 한다.
10. 위젯을 화면에서 제거하면 mounted == false
State 객체가 소멸하면 마지막으로 mounted 속성이 false로 되면서 생명주기가 끝난다.
mounted 속성이 false가 되었다는 것은 이 State는 재사용할 수 없다는 의미이다.
'모바일 > Flutter' 카테고리의 다른 글
[Flutter] 04 플러터 위젯 사용법 - 스캐폴드/머티리얼 디자인 (0) | 2023.02.16 |
---|---|
[Flutter] 03 플러터 내부 구조 - 플러터 간단 실습 (0) | 2023.01.07 |
[Flutter] 03 플러터 내부 구조 - 플러터 프로젝트, 위젯 (0) | 2023.01.06 |
[Dart] null 오류 해결 / not_initialized_non_nullable_variable (0) | 2023.01.05 |
[Flutter] 02 다트 언어의 특징 (0) | 2023.01.05 |
댓글