StatelessWidget은 한번 만들어지면 갱신이 불가능해서 생명주기가 없습니다.
하지만 StatefulWidget은 10단계의 생명주기가 있습니다.
1. 상태를 생성하는 createState() 함수
StatefulWidget 클래스를 상속받는 클래스는 반드시 createState() 함수를 호출해야합니다. 이 함수는 다른 생명주기 함수들이 포함된 State 클래스를 반환합니다. 즉, 위젯의 상태를 생성하는 함수로 생각할 수 있습니다.
class MyHomePage extends StatefulWidget{
@override
_MyHomePageState createState() => new _MyHomePageState();
}
- State와 StatefulWidget 클래스를 나누어 놓은 이유 : 성능때문
StatefulWidget 가 State 클래스보다 상대적으로 더 무겁습니다. StatefulWidget 에서 감시하고 있다가 상태 변경 신호가 오면 State 클래스가 화면을 갱신하도록 구현합니다. 만약 StatefulWidget에서 바로 갱신하면 나중에 화면이 종료되어도 할당받은 메모리가 없어질 때까지 시간이 오래 걸릴 수 있습니다. 따라서 상태 변경 감시는 StatefulWidget가 하고 실제 갱신 등은 State 클래스가 담당합니다.
2. 위젯을 화면에 장착하면 mounted==true
createState() 함수가 호출되어 상태 생성시 바로 mounted 속성이 true로 변경됩니다. mounted 속성이 true 라는 것은 위젯을 제어할 수 있는 buildContext 클래스에 접근할 수 있다는 의미입니다. buildContext가 활성화되어야 비로소 setState() 함수를 이용할 수 있습니다. 그렇지 않으면 오류가 발생합니다. 화면 구성이 안되었는데 setState()를 사용할 수는 없기 때문입니다.
따라서 다음처럼 setState() 함수를 호출하기 전에 mounted 속성을 점검 코드로 활용하면 좀 더 안전하게 작성할 수 있습니다.
if(mounted){
setState()
}
3. 위젯을 초기화하는 initState() 함수
initState()는 위젯을 초기화할 때 한 번만 호출합니다. 주로 데이터 목록을 만들거나 처음 필요한 데이터를 주고받을 때 호출합니다.
아래의 코드는 initState()를 호출 시 _getJsonData()를 호출해 서버에서 받아온 데이터를 화면에 출력하게 만들 수 있습니다.
@override
initState(){
super.initState();
_getJsonData();
}
4. 의존성 변경 시 호출하는 didChangeDependencies() 함수
위젯을 초기화하는 initState() 함수가 호출된 후 이어서 바로 호출되는 함수가 didChangeDependencies()입니다. 이 함수는 데이터에 의존하는 위젯이라면 화면에 표시하기 전에 꼭 호출해야 합니다. 주로 상속받은 위젯을 사용할 때 피상속자가 변경되면 호출합니다.
5. 화면에 표시하는 build() 함수
build() 함수는 Widget을 반환합니다. 즉, 위젯을 화면에 렌더링합니다. build()함수에서 위젯을 만들고 반환하면 비로소 화면에 표시됩니다.
@override
Widget build(BuildContext context){
return MaterialApp(
title: 'flutter demo',
theme: ThemeData(
primarySwatch: Colors.amber,
home: MyHomePage(title: 'flutter demo home page'),
),
}
6. 위젯을 갱신하는 didUpdateWidget() 함수
부모 위젯이나 데이터가 변경되어 위젯을 갱신해야할 때 호출합니다. 만약 initState()에서 특정 이벤트에 의해 위젯이 변경되면 didUpdateWidget()함수를 호출해 위젯을 갱신할 수 있습니다.
@override
void didUpdateWidget(Widget oldWidget){
if (oldWidget.importantProperty != widget.importantProperty){
_init();
}
}
7. 위젯의 상태를 갱신하는 setState() 함수
setState() 함수로 데이터가 변경되었다는 것을 알려주고 변경된 데이터를 이용해 화면의 UI를 바꿀 수 있도록 합니다.
void updateProfile(String name){
setStatae(() => this.name=name);
}
8. 위젯의 상태 관리를 중지하는 deactiavte() 함수
deactivate() 함수는 State 객체가 플러터의 구성 트리로부터 제거될 때 호출됩니다. 다만, State 객체가 제거되었다고 해서 해당 메모리까지 지워지지는 않습니다. dispose() 함수를 호출하기 전까지는 State 객체를 재사용할 수 있습니다.
9. 위젯의 상태 관리를 완전히 끝내는 dispose() 함수
State 객체를 영구적으로 소멸할 때 사용합니다. 이 함수가 호출되면 해당 위젯을 종료한다는 것입니다. 위젯 소멸시 꼭 호출해야하는 함수라면 dispose() 안에서 호출해야합니다.
10. 위젯을 화면에서 제거하면 mounted==false
State 객체가 소멸하면 마지막으로 mounted 속성이 false 로 되면서 생명주기가 끝납니다. 이 State는 재사용할 수 없다는 뜻입니다.
'app개발 > flutter' 카테고리의 다른 글
| [Flutter] Json으로 API값 가져오는 방법 (0) | 2022.05.12 |
|---|---|
| [Flutter] Flutter 위젯 사용법 (0) | 2021.11.06 |
| [Flutter] Dart언어란? (0) | 2021.11.06 |
| [flutter] StatefulBuilder (0) | 2021.09.19 |
| flutter UI 개발하면서 막혔던 것들 정리 1 (0) | 2021.08.31 |