StatefulWidget을 생성할 때, StatefulWidget의 생성자 호출 후에 createState()가 호출된다. 이 메소드는 state 객체를 생성하며, BuildContext가 state 객체에 할당된다. BuildContext는 위젯 트리에서 이 위젯이 위치하는 곳에 대한 핸들이다.
class HomeScreen extends StatefulWidget {
HomeScreen({Key key}) : super(key: key);
HomeScreenState<StatefulWidget> createState() => HomeScreen();
}
StatefulWidget에서 필수적으로 오버라이드 되어야하는 메소드이다.
모든 위젯은 bool 타입의 mounted라는 프로퍼티를 가지고 있다. BuildContext가 state 객체에 할당되면 mounted는 true로 설정된다. mounted는 state 객체가 현재 위젯 트리에 있는지, 없는지에 대한 정보를 제공한다.
위젯이 마운트 해제 상태일 때 setState()를 호출하는 것은 에러이다.
setState() 호출 시 비동기 처리로 시간이 지연되는 경우, 위젯의 마운트가 해제될 수 있다.
그래서 다음과 같이 사용하는 것이 좋다.if(mounted) { setState(() {}); }
또는
void setState(fn) { if(mounted) { super.setState(fn); } }
state 객체가 생성될 때, state의 생성자 호출 후에 initState()가 호출된다.
void initState() {
super.initState();
}
필수적으로
super.initState()
를 호출해야 한다.
Lifecycle 중 1번만 호출된다.
initState() 호출 후에 didChangeDependencies()가 호출된다. 또한 해당 위젯이 의존하는 데이터의 객체가 변경될 때마다 호출된다. BuildContext.inheritFromWidgetOfExactType을 호출할 수 있는 첫 번째 메소드이다.
void didChangeDependencies() {}
didChangeDependencies() 호출 후에는 항상 build()가 호출된다.
state 객체가 dirty이면 build()를 실행한다.
didChangeDependencies() 호출 후에 bulid()가 호출된다. 또한 위젯이 변경될 때마다 호출된다.
build(BuildContext context) {
return Scaffold()
}
Widget
StatefulWidget에서 필수적으로 오버라이드 되어야하는 메소드이다.
반드시 Widget 타입을 반환해야 한다.
state 객체가 clean이면 build()를 실행하지 않는다.
부모 위젯이 변경되어 해당 위젯이 다시 빌드되어야 하는데, 동일한 runtimeType으로 다시 빌드되는 경우 didUpdateWidget()이 호출된다.
void didUpdateWidget(Home oldWidget) {
super.didUpdateWidget(oldWidget);
}
didUpdateWidget() 호출 후에는 항상 build()가 호출된다.
데이터 변경되어 UI가 다시 빌드되어야 할 경우, 현재 state 객체가 dirty라고 프레임워크에게 알려준다.
void function() {
setState(() {});
}
setState() 호출 후에는 항상 build()가 호출된다.
위젯이 마운트 해제 상태일 때 setState()를 호출하는 것은 에러이다.
setState() 호출 시 비동기 처리로 시간이 지연되는 경우, 위젯의 마운트가 해제될 수 있다.
그래서 다음과 같이 사용하는 것이 좋다.if(mounted) { setState(() {}); }
또는
void setState(fn) { if(mounted) { super.setState(fn); } }
state 객체가 트리에서 제거되지만, 현재 프레임의 변경이 완료되기 전에 트리의 다른 지점에 다시 삽입될 경우에 호출된다.
void deactivate() {
super.deactivate();
}
state 객체가 영구적으로 제거될 때 호출된다.
void dispose() {
super.dispose();
}
위젯은 다시 마운트 될 수 없다.
setState()를 호출 하는 것은 에러이다.
상위 위젯에 의해 구성이 약간 조정될 때 사용한다.
reassemble() 호출 후에 didUpdateWidget()이 호출된다.
void reassemble() {}
디버그 모드에만 있고 릴리즈 모드에는 없다.
가독성이 매우 좋으네요~~