한 번만 빌드하는 위젯. 단순 화면에 표시하는 용도로 쓰이는 듯함.
생명 주기가 없고, 관리하기 용이함.
상태가 있으며, 변화가 있는 위젯. 상태에 따라 UI가 렌더링된다.
class MyClass extends StatefulWidget {
State<MyClass> createState() => _MyClassState();
}
createState()는 statefulWidget을 생성 후 바로 호출되며 state object를 생성한다.
위젯 트리에 상태를 만들기 위해 호출된다.
class _MyClassState extends State<MyClass> {
//...
void initState() {
super.initState();
}
}
object가 트리에 주입되면, initState()가 생성자 다음으로 자동으로 실행된다.
state object가 처음 생성될 때, 단 한 번만 호출된다.
didChangeDependencies()
initState()가 호출된 이후 호출된다.
상속받은 위젯을 사용할 때, 부모가 변경되면 호출된다.
build()
위젯을 반환하여, 렌더링되어 화면에 표시됨.
이 메소드는 반드시 있어야 하며, 생명 주기 동안 여러 번 호출되지만
첫 호출은 didChangeDependencies()가 호출된 다음이다.
state에 속한 위젯이 업데이트될 때마다 프레임워크는 항상 build()를 실행한다.
didUpdateWidget() 혹은 setState()가 호출될 때마다.
didUpdateWidget()
위젯의 구성이 변경될 때마다 호출된다.
부모 위젯이 구성을 변경하고, 다시 빌드해야될 때 호출된다.
setState()
상태가 변경되었을 때, 프레임워크에 상태가 변경됐음을 알린다.
deactivate()
state object가 트리로부터 삭제될 때마다 호출됨.
구성 트리로부터 삭제되어 관리되진 않으나, 메모리 해체까지 된 건 아니라 사용할 수는 있다.
dispose()
state object가 영구적으로 삭제될 때 호출된다.
mounted == true // moundted == false
모든 위젯은 this.mounted 속성을 가지고 있다.
buildContext가 할당될 때, this.mounted가 true로 리턴된다.
위젯이 unmounted일 때는 setState를 호출할 경우 에러가 발생될 수 있다.
자신의 상위에 있는 위젯들의 정보들을 담고 있다.
리액트에서 useContext와 느낌이 비슷한 것 같다.
Theme.of(context).textTheme.titleLarge!.color