안드로이드 코틀린 프로그래밍에서의 Activity Lifecycle 처럼 플러터에서도 위젯의 생명주기가 있다. 플러터에서는 크게 Stateless Widget, Stateful Widget 두 가지가 존재하는데, Stateless 위젯의 경우 한 번 만들어지면 갱신하지 않으므로 따로 생명주기라는게 없다. 따라서 플러터에서 생명주기라 함은 곧 Stateful Widget의 생명주기라고 할 수 있겠다.
Stateful widget 은 또 StatefulWidget 클래스와 State 클래스로 구분되어 있는데, 화면 갱신 등의 실제 동작은 State 클래스에서 이루어지므로 Stateful Widget 생명주기는 또한 State 클래스의 생명주기라고 해도 될 것 같다.
1. createState()
Stateful 위젯이 호출되면 StatefulWidget 클래스에서 createState() 함수가 호출되게 된다.
class LifeCycle extends StatefulWidget {
const LifeCycle({Key? key}) : super(key: key);
@override
State<LifeCycle> createState() => _LifeCycleState();
}
2. mounted == true
createState() 함수가 호출되어 State 객체가 생성되고 buildContext가 할당되면 mounted 속성이 true가 된다. mounted 가 false일 때 setState() 함수를 호출하면 오류가 발생한다. 안전한 setState() 동작을 위해 아래처럼 사용하기도 한다.
if(mounted) {
setState(() {
...
});
}
3. initState()
위젯 생성시 호출되는 함수로 한번만 호출된다. 데이터 초기화 등을 수행하면 된다.
4. didChangeDependencies()
위젯이 최초 생성될 때 initState() 직후 호출되고, 위젯이 의존하는 데이터의 객체가 호출될 때 호출된다. 이 함수에 대해서는 아직 정확하게 이해하지 못한 상태인데, 아마, 예를들어 Cloud Firestore DB 를 사용하는 경우에 stream data 가 변경되어 화면이 자동 update 될 때 호출되지 않을까?? 이건 좀 테스트 해 봐야 할 것 같다.
5. build()
위젯을 렌더링하여 화면에 그리는 함수. 뭔가 변경될 때 마다 호출되니 가장 많이 호출되는 함수일 듯. setState() 함수를 사용할 때 마다 호출된다.
6. didUpdateWidget(Widget oldWidget)
부모 위젯으로 인해 이 위젯을 rebuild 해야 하는 경우 호출된다. 부모 위젯의 변경으로 애니메이션을 재실행 한다던가 어떤 동작을 수행해야 할 때 사용할 수 있다.
@override
void didUpdateWidget(Widget oldWidget) {
super.didUpdateWidget(oldWidget);
if (widget.value != oldWidget.value) {
// TODO: start a transition between the previous and new value
}
}
7. setState()
데이터가 변경되어 화면이 업데이트 되어야 함을 프레임워크에 알리기 위해 주로 개발자가 호출하는 함수이다. 플러터 프레임워크 내부적으로 어떻게 로직이 흘러가는지 정확히 이해하고 사용할 수 있어야 하겠다. setState() 함수가 호출되면 화면 업데이트를 위해 build() 함수가 이어서 호출된다.
8. deactivate()
State 객체가 위젯 트리에서 제거될 때 호출되는 함수이다. 기본적으로 사용될 일이 별로 없을 것 같은데, GlobalKey를 사용하여 현재 위젯을 위젯 트리의 특정 위치로 이동시키게 되면, 해당 위젯의 State 객체가 제거되었다 추가되는 것이므로 deactivate() 함수를 사용할 수 있다.
9. dispose()
State 객체가 위젯 트리에서 영구히 제거될 때 호출되며, deactivate() 함수 다음에 호출된다. 위젯의 사용을 종료할 때 실행해야 할 코드들을 여기서 실행시키면 된다.
10. mounted == false
State 객체가 소멸하고 mounted 가 false 가 되면 더이상 State를 사용할 수 없다. mounted 가 false 일땐 setState() 를 호출할 수 없다.
'프로그래밍 > flutter' 카테고리의 다른 글
flutter에서 match_parent 효과 (0) | 2022.03.30 |
---|---|
GoogleSignInPlugin.java uses or overrides a deprecated API. 오류처리 (0) | 2021.12.12 |
flutter에서 android native code 와 연동 (0) | 2021.11.06 |
android simulator 에서 dart process stop 불가 현상 (0) | 2021.10.12 |
android studio project window color 의미 (0) | 2021.10.11 |