상태 있는 위젯(StatefulWidget)이 태어나고 사라질 때까지의 생명주기. React 컴포넌트 뭐서클과 거의 대응. (일반 개념)
| 메서드 | 언제 | React 비유 |
|---|---|---|
initState() |
위젯이 처음 생길 때 1번 | 마운트 / useEffect(fn, []) |
build() |
화면을 그릴 때마다 | return <JSX> (매 렌더) |
dispose() |
위젯이 사라질 때 1번 | 언마운트 / useEffect cleanup |
class _MyState extends State<My> {
@override
void initState() {
super.initState();
// 구독 시작, 초기 데이터 로드
}
@override
void dispose() {
// 컨트롤러·타이머·구독 정리 (켜면 반드시 끕다)
super.dispose();
}
@override
Widget build(BuildContext context) => ...;
}
initState에서 구독·타이머를 시작했으면 dispose에서 반드시 정리해야 한다. 안 하면 메모리 누수. React useEffect의 "return 정리함수"와 똑같은 짝.
비동기 작업(await) 뒤에 화면이 이미 사라졌을 수 있다. 그때 mounted로 확인하지 않고 상태를 건드리면 크래시.
final data = await fetch();
if (!mounted) return; // 화면 사라졌으면 중단
setState(() => _data = data);
React에서 언마운트 후 setState 하면 경고 뜨는 것과 같은 문제를 막는 장치.
build가 끝난 직후에 뒤약으로 실행한다. 초기 데이터 로딩이나 context가 준비된 뒤 해야 하는 작업에 쓴다.
WidgetsBinding.instance.addPostFrameCallback((_) {
if (!mounted) return;
// 화면이 완성된 뒤 실행할 작업
});