티스토리 뷰
반응형
플러터의 State 클래스에서 코드를 작성하다 보면 위젯에 사용할 변수들을 build 메서드 내부에 지역 변수로 선언하는 경우가 종종 있었다.
다음은 PageView에 사용할 PageController를 build 메서드 내부에 지역변수로 선언된 예제이다.
class _PrayerDetailState extends State<PrayerDetail> {
// ...
@override
Widget build(BuildContext context) {
final controller = PageController(initialPage: selectedPage);
return PageView(
controller: controller,
// ...
);
}
}
build 메서드는 위젯의 렌더링을 담당하는 메서드로 만드는 것이 좋다. build 메서드 내부에 지역 변수로 PageController를 생성하면, 해당 위젯이 리빌드 될 때마다 새로운 PageController 인스턴스가 생성된다. 이는 메모리 낭비와 예기치 않은 동작을 초래할 수 있다.
따라서 PageController를 클래스 속성으로 만들고, initState 메서드에서 초기화하는 것이 더 바람직하다. initState 메서드는 위젯의 상태를 초기화하는 데 사용되는 메서드로, 위젯이 처음 생성될 때 한 번만 호출된다.
위의 코드를 올바르게 수정하면 다음과 같다.
class _PrayerDetailState extends State<PrayerDetail> {
late PageController controller;
@override
void initState() {
super.initState();
controller = PageController(initialPage: selectedPage);
}
@override
void dispose() {
controller.dispose(); // 위젯이 제거될 때 컨트롤러를 해제합니다.
super.dispose();
}
@override
Widget build(BuildContext context) {
return PageView(
controller: controller,
// ...
);
}
}
PageController는 dispose 메서드에서 해제된다. 이렇게 하면 PageController는 위젯 수명 주기에 맞게 제거되며, 메모리 누수나 예기치 않은 동작을 방지할 수 있다.
반응형
'Flutter' 카테고리의 다른 글
플러터] DropdownButton의 Failed assertion: line 890 pos 15 (0) | 2023.07.14 |
---|---|
플러터] 불변 타입과 가변 타입, 얕은 복사와 깊은 복사 (0) | 2023.07.14 |
플러터] showDialog 사용 시, No MaterialLocalizations found 에러 해결 방법 (0) | 2023.07.08 |
플러터] 내비게이터 백 버튼 제어하기 (0) | 2023.07.08 |
플러터] Navigator.push와 MaterialApp의 관계 그리고context (0) | 2023.07.08 |
댓글
공지사항