본문 바로가기
flutter

Flutter[플러터] / ValueListenableBuilder 를 사용하여 값이 바뀌면 자동 적용하기 (알림, 즉시, 바로, ValueNotifier ) ValueListenableBuilder (Flutter Widget of the Week)

by ch5c 2025. 5. 19.
반응형

ValueListenableBuilder<T> class

ValueListenable 과 동기화된 콘텐츠를 제공하는 위젯입니다.

ValueListenable<T> 와 구체적인 값에서 위젯을 빌드하는 빌더가 주어지면, 이 클래스는 자동으로 ValueListenableT 의 리스너로 등록되고 값이 변경될 때 업데이트된 값으로 빌더를 호출합니다.

https://youtu.be/s-ZG-jS5QHQ

빌더 함수에 ValueListenable 값에 의존하지 않는 하위 트리가 포함된 경우 애니메이션 틱마다 다시 빌드하는 대신 해당 하위 트리를 한 번 빌드하는 것이 더 효율적입니다.

미리 작성된 하위 트리를 자식 매개변수 로 전달하면 ValueListenableBuilder 가 이를 빌더 함수 로 다시 전달하여 빌드에 통합할 수 있습니다.

미리 만들어진 자식 요소를 사용하는 것은 전적으로 선택 사항이지만, 어떤 경우에는 성능을 크게 향상할 수 있으므로 좋은 방법입니다.

 

공식 문서 코드

 


ValueListenableBuilder 는 간단한 값이 바뀌는걸 리슨하고 그때마다 UI 를 다시 그려주는 위젯이다. ValueNotifier 로 '감시할 값'을 만들고 ValueListenableBuilder 로 그걸 감시하면서 그 값이 바뀌면 UI 를 다시 그려주는 구조가 되겠다. 한번 알아보자.

하위 속성
속성명 타입 기본값 설명
valueListenable ValueListenable<T> 값이 변경될 때마다 builder를 호출하게 만드는 리스너 객체
builder ValueWidgetBuilder<T> value와 child를 기반으로 위젯을 빌드하는 함수
child Widget? null builder 함수에 전달되며, 값 변화에 영향을 받지 않는 하위 위젯

 

일단 그럼 ValueNotifier 를 이해하고 넘어가야 할 것이다. 굉장히 쉬운 위젯이라고 할 수 있겠는데 바로 특정한 값을 가지고 있고 그 값이 바뀌면 알림을 보내는 기능을 하는 위젯이다. 그니까 값 바뀌면 알림 보내주는 위젯이다.

기본적인 사용법은 이렇게 된다.

ValueNotifier<int> counter = ValueNotifier<int>(0);

뭔가 거창하다만 그냥 별거 없다. int 타입인 0을 가진 counter 라는 변수 하나 만든 거다. 근데 이제 상태를 리슨 할 수 있는.

이 값에 접근해서 사용하기 위해선 .value 를 사용해야 한다. ex) counter.value

ValueNotifier 는 Listenable 이라는 기능을 가지고 있는데 이것 때문에 이걸로 선언한 변수를 리슨하고 있으면 (addListener 혹은 ValueListenableBuilder) 값이 바뀔 때 자동으로 알림이 보내지는 구조이다.

 

 

이거 하나면 확실하게 이해가 될 것이다. 코드는 정말 짧지만 직빵으로 이해가 되어버릴 것이다.

final counter = ValueNotifier<int>(0);

counter.addListener(() {
  print('새로운 값: ${counter.value}');
});

counter.value++;
counter.value = 5;

지금 이 코드에서 뭐 print 를 두 번 호출하고 그런 것이 전혀 없다. 하지만 Run 시킨 결과물이 어떠한가?

새로운 값: 1
새로운 값: 5

놀랍게도 프린트가 두 번이 되어버린 모습이다. 그렇다. counter.addListener 가 counter 의 값을 듣고 있다가 변경되니 곧바로 반응을 하면서 프린트를 해버린 모습이 되겠다. 이렇게 ValueNotifier 는 복잡한 상태 관리 없이도 간단하게 반응하는 위젯을 만들어 줄 수 있는 것이다. 여기까지가 ValueNotifier 를 쉽게 설명한 것이고 이제 다시 본론으로 가보자면

ValueListenableBuilder 는 바뀐 값을 UI 에 다시 반영, 그려주는 위젯이 되겠다. 엄청 쉽다고 느낄 거다. 실제로 그러하니까.

ValueListenableBuilder(
  valueListenable: valueListenable, // 리슨할 값 넣어주기
  builder: builder, 
)

이제 이 필수 속성에 무엇이 들어가야 할지 감이 잡히는가? 그렇다.

valueListenable 에는 ValueNotifier 을 타입으로 갖고 있는 변수(값)를 넣어주면 되는 것이다.

이제 그 값이 변경되면 알아서 ValueListenableBuilder 가 반응하면서 UI 를 다시 그려줄 것이고. 엄청나게 간단하면서 유용하다.

 

이제 언제 써야 할지 감이 올 것이다.

  • setState 쓰기 귀찮을 때
  • 특정값 하나만 리빌드 시키고 싶을 때
  • 복잡한 관리 필요 없는 간단한 상태일 때

이제 이러면 완벽히 이해한 것이다. 이런 빌더들은 볼 때마다 이번엔 또 뭐지... 하는 의문이 들기 마련인데 그중에서 쓸모없는 것은 역시 없는 모양이다. 구글 개발자들이 만든 것에 역시 의문을 품어서는 안 되는 게 아닐까 싶다. 암튼 도움이 되었길 바라며 마치겠다.

반응형
반응형