상태 있는 위젯(StatefulWidget)이 태어나고 사라질 때까지의 생명주기. React 컴포넌트 뭐서클과 거의 대응. (일반 개념)

3개 메서드가 핵심

메서드 언제 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 정리함수"와 똑같은 짝.

mounted — "이 위젯 아직 살아있나?"

비동기 작업(await) 뒤에 화면이 이미 사라졌을 수 있다. 그때 mounted로 확인하지 않고 상태를 건드리면 크래시.

final data = await fetch();
if (!mounted) return;   // 화면 사라졌으면 중단
setState(() => _data = data);

React에서 언마운트 후 setState 하면 경고 뜨는 것과 같은 문제를 막는 장치.

addPostFrameCallback — "화면 다 그려진 뒤에 실행"

build가 끝난 직후에 뒤약으로 실행한다. 초기 데이터 로딩이나 context가 준비된 뒤 해야 하는 작업에 쓴다.

WidgetsBinding.instance.addPostFrameCallback((_) {
  if (!mounted) return;
  // 화면이 완성된 뒤 실행할 작업
});