State는 위젯이 유지해야 하는 변경 가능한 데이터입니다. Flutter에서는 위젯이 상태를 갖는 방식에 따라 두 가지 유형으로 나뉩니다.
StatelessWidget: 상태를 가지지 않는 위젯
StatefulWidget: 상태를 가질 수 있는 위젯
내부적으로 변경 가능한 상태가 없는 위젯입니다. 즉, 화면에 고정된 UI를 렌더링할 때 사용합니다.
class MyStatelessWidget extends StatelessWidget {
Widget build(BuildContext context) {
return Text("Hello, Flutter!");
}
}
부 상태가 변경될 수 있는 위젯입니다. 상태를 변경할 때 setState를 호출하여 UI를 다시 그릴 수 있습니다.
class MyStatefulWidget extends StatefulWidget {
_MyStatefulWidgetState createState() => _MyStatefulWidgetState();
}
class _MyStatefulWidgetState extends State<MyStatefulWidget> {
int _counter = 0;
void _incrementCounter() {
setState(() {
_counter++;
});
}
Widget build(BuildContext context) {
return Column(
children: [
Text('Counter: $_counter'),
ElevatedButton(
onPressed: _incrementCounter,
child: Text("Increment"),
),
],
);
}
}
위 예제에서 _counter 변수를 setState로 업데이트하면서 UI가 변경됩니다.
State 객체를 생성합니다.
위젯이 생성될 때 한 번만 호출됩니다.
초기 상태를 설정하는 데 사용됩니다.
InheritedWidget과 같은 외부 종속성이 변경될 때 호출됩니다.
예: MediaQuery.of(context) 또는 Theme.of(context) 값이 변경될 경우.
initState에서는 context를 안전하게 사용할 수 없는 경우가 있기 때문에 didChangeDependencies에서 접근하는 것이 일반적입니다.
UI를 그리는 함수로, 상태가 변경될 때마다 호출됩니다.
부모 위젯이 이 위젯을 다시 빌드할 때 호출됩니다.
새로운 위젯과 기존 위젯을 비교하여 필요하면 상태를 업데이트할 수 있습니다.
위젯이 위젯 트리에서 제거될 때 호출됩니다.
위젯이 완전히 제거될 때 호출됩니다.
리소스를 정리하는 데 사용됩니다 (예: 컨트롤러 해제, 리스너 제거 등).