티스토리 뷰

플러터의 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는 위젯 수명 주기에 맞게 제거되며, 메모리 누수나 예기치 않은 동작을 방지할 수 있다.

댓글
공지사항