본문 바로가기

Programming/Flutter

Flutter StatefulWidget의 lifecycle(생명주기)

반응형

StatefulWidget의 lifecycle은 다음 단계를 따른다.

  • createState()
  • initState()
  • didChangeDependecies()
  • build()
  • didUpdateWidget()
  • setState()
  • deactivate()
  • dispose()

 

1. createState()

: statefulWidget이 빌드되었을 때, createState()를 즉시 호출한다. 이 메소드는 반드시 존재해야 한다.

class HomeScreen extends StatefulWidget {
    HomeScreen({Key key}): super(Key: key);

    @override
    HomeScreenState<StatefulWdiget> createState() => HomeScreen();
}

 

2. initState()

: 각 state에 대해서 한번만 호출된다. initState()에서 일부 코드를 추가하면 widget이 빌드되기 전에 initStaet()가 먼저 실행된다.

이 메소드는 상위 widget(statefulWdiget)의 initState()를 호출하는 super.initState()를 호출해야한다. 여기에서 변수, 객체, stream, AnimationController 등을 초기화 할 수 있다.

 

@override
void initState(){
    super.initState();
}

 

3. didChangeDependencies()

: didChangeDependencies()는 initState() 다음에 호출된다. 그리고 widget이 의존하는 데이터의 객체가 호출될때 호출된다. 상속한 widget이 업데이트될 때 네트워크 호출 등이 필요한 경우 유용하다.

 

@overrid
void didChageDependencies(){
    
}

 

4. build()

: 모든 UI Widget을 렌더링할 때 마다 호출. 반드시 Widget을 리턴해야 한다.

 

@override
Widget build(BuildContext context) {
  return Scaffold()
}

 

5. didUpdateWidget()

: didUpdateWidget()은 상위 위젯이 변경되어 이 widget을 업데이트해야 하는 경우 hot reload를 하기 위해 호출한다. 상위 widget이 디자인 또는 속성을 변경하고 하위 widget을 수정해야하는 시점에서 호출된다.

 

@protected
void didUpdateWidget(Home oldWidget) {
  super.didUpdateWidget(oldWidget);
}

 

6. setState()

: setState()를 호출하면 데이터가 변경됨을 의미한다. setState()가 호출되면 BuildContext의 widget을 다시 빌드하게 된다.
dispose()를 호출한 이후에 setState()를 호출하게 된다면 오류가 발생한다.

 

void function(){
  setState(()=>{});
}

 

7. deactivate()

: deactivate()는 state가 트리에서 제거될 때 고려된다.

 

@override
void deactivate(){
  super.deactivate();
}

 

8. dispose()

: dispose()는 initState()와 반대되며, 객체와 state가 widget 트리에서 제거되어야 할 때 사용된다.
여기에서 stream 구독 취소, AnimationController 폐기, Timer 취소 등의 작업을 한다.

 

@override
void dispose(){
  super.dispose();
}

 

*참고: https://medium.flutterdevs.com/app-lifecycle-in-flutter-c248d894b830

반응형