initState
- 플러터에서 위젯의 상태가 처음 생성될 때 호출되는 메서드입니다.
- StatefulWidget의 상태 클래스에서 오버라이드 할 수 있으며 위젯의 초기 설정, 초기화 작업을 수행하는데 사용됩니다.
- 위젯이 처음 빌드되기 전에 호출되기 때문에 위젯이 화면에 나타나기 전에 필요한 작업들을 설정할 수 있는 최적의 위치입니다
특징
- 한 번만 호출됨
- initState는 위젯의 상태가 처음 생설될 때 단 한번만 호출됩니다.
- 사용처
- 네트워크 요청, 스트림 구독, 컨트롤러 초기화 등 초기 설정 작업을 수행하는데 사용됩니다.
- super.initState() 호출
- initState 메서드를 오버라이드할 때, 반드시 super.initState()를 호출해야합니다.
이는 부모 클래스의 초기화 작업을 보장합니다.
- initState 메서드를 오버라이드할 때, 반드시 super.initState()를 호출해야합니다.
class MyStatefulWidget extends StatefulWidget {
@override
_MyStatefulWidgetState createState() => _MyStatefulWidgetState();
}
class _MyStatefulWidgetState extends State<MyStatefulWidget> {
@override
void initState() {
super.initState();
// 초기화 작업 수행
print('위젯이 처음 생성되었습니다.');
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('MyStatefulWidget'),
),
body: Center(
child: Text('Hello, World!'),
),
);
}
}
이러한 형태로 StatefulWidget에 @override를 사용하여
initState() {
super.initState();
}
를 실행할 수 있습니다.
예시
네트워크 요청 초기화
서버에서 데이터를 받아와야할때 선요청하는 경우.
@override
void initState() {
super.initState();
fetchData();
}
void fetchData() async {
final response = await http.get('https://api.example.com/data');
// 데이터 처리 로직
}
컨트롤러 초기화
텍스트 필드나 애니메이션 등에서 사용하는 컨트롤러를 초기화 하는 경우.
late TextEditingController _controller;
@override
void initState() {
super.initState();
_controller = TextEditingController();
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
프리퍼런스 불러오기
Sharedpreferences를 사용하여 초기 데이터를 로드하는 경우.
@override
void initState() {
super.initState();
_loadPreferences();
}
void _loadPreferences() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
// 프리퍼런스 데이터 로드 로직
}
dispose
- 위젯이 소멸될 때 호출됩니다.
- 이 메서드는 더 이상 사용되지 않을 때 리소스를 해제하거나 정리 작업을 수행하는 데 사용됩니다.
특징
- 위젯 소멸 시 호출
- dispose는 해당 위젯이 트리에서 제거되거나, 위젯이 파괴될 때 호출됩니다.
- 이 메서드는 위젯의 생애주기 중 마지막으로 호출되는 메서드입니다.
- 사용처
- 애니메이션 컨트롤러나 스트림을 해제할 때
- 이벤트 리스너를 제거할 때
- 메모리 누수를 방지하기 위해 리소스를 명시적으로 해제해야 할 때
- 리소스 해제
- 애니메이션 컨트롤러, 스트림, 텍스트 컨트롤러, 이벤트 리스너 등 외부 리소스를 해제하는 데 사용됩니다.
- 이러한 리소스는 수동으로 해제해 주어야 하며, 그렇지 않으면 메모리 누수 문제가 발생할 수 있습니다.
- 부모 클래스의 dispose 호출
- dispose 메서드를 재정의할 때는 반드시 super.dispose()를 호출하여 부모 클래스의 정리 작업이 수행되도록 해야 합니다.
@override
void dispose() {
// 애니메이션 컨트롤러 해제
_controller.dispose();
super.dispose();
}
- 비동기 작업 취소
- 비동기 작업이나 타이머 등이 있는 경우, dispose에서 해당 작업을 취소하거나 중지하는 코드를 추가할 수 있습니다.
- 이로 인해 위젯이 파괴된 이후에도 작업이 진행되는 것을 방지할 수 있습니다.
- 정리 작업은 마지막
- dispose 메서드에서 수행되는 작업은 위젯이 더 이상 트리에서 활성화되지 않는다는 가정하에 진행됩니다. 따라서 위젯의 상태나 UI에 영향을 미치는 작업은 dispose에서 하지 않습니다.
예시
class MyWidgetState extends State<MyWidget> {
AnimationController _controller;
@override
void initState() {
super.initState();
_controller = AnimationController(
vsync: this,
duration: Duration(seconds: 2),
);
}
@override
void dispose() {
// 애니메이션 컨트롤러를 해제하여 메모리 누수를 방지
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Container(
// 위젯의 UI 코드
);
}
}
이 예시에서 dispose 메서드는 애니메이션 컨트롤러 _controller를 해제하는 역할을 합니다.
이는 위젯이 파괴될 때 리소스를 적절히 해제하여 메모리 누수를 방지하기 위한 중요한 과정입니다.
'Flutter > Dart Language' 카테고리의 다른 글
[플러터 Flutter] 조건문의 종류 (0) | 2024.08.01 |
---|---|
[플러터 Flutter] enum이란? (0) | 2024.07.31 |
[플러터 Flutter] 예외처리 try-catch와 throw, finally (1) | 2024.07.16 |
[플러터 flutter] 비동기 / 동기 async, awiat, future은 무엇인가? (0) | 2024.07.04 |
[플러터 Flutter] 초기화란? (0) | 2024.06.29 |