본문 바로가기
Flutter

Child가 Rebuild 되지 않도록 하는 원리

by 붕어사랑 티스토리 2024. 7. 23.
반응형

플러터의 위젯을 보다보면 어떤 위젯들은 리빌드 될 때 child라는 변수를 받아서 리빌드가 되더라도 child 부분은 리빌드되지 않도록 재활용 한다.

 

 

이 원리가 궁금해서 ListenableBuilder를 분석해보았다

 

 

 

 

 

위 코드를 보면 이 위젯은 child를 생성자에 받아서 빌더 메소드에 활용한다.

빌더 메소드의 정의를 보면 다음과 같다.

 

 

여기서 우리가 알 수 있는건, 빌더 메소드는 그저 위젯을 리턴하는 평범한 함수이다.

 

그리고 child를 받아 이를 위젯만드는데 활용하고 있다.

 

 

간단하게 정리하자면, A라는 위젯이 외부에서 만들어진 B라는 위젯을 생성자에서 받아, 이를 빌드 메소드에 사용한다면. 이때 리빌드 되더라도 B는 다시 리빌드 되지 않는다.

 

걍 한마디로 외부에서 만들어서 넘겨주면 재활용이 가능하다는것

 

 

 

퍼포먼스와 관련하여 공식문서에서도 나와있는 내용이다

https://docs.flutter.dev/perf/best-practices

 

Performance best practices

How to ensure that your Flutter app is performant.

docs.flutter.dev

 

The traversal to rebuild all descendents stops when the same instance of the child widget as the previous frame is re-encountered. This technique is heavily used inside the framework for optimizing animations where the animation doesn't affect the child subtree. See the TransitionBuilder pattern and the source code for SlideTransition, which uses this principle to avoid rebuilding its descendents when animating. ("Same instance" is evaluated using operator ==, but see the pitfalls section at the end of this page for advice on when to avoid overriding operator ==.)

 

대충 자식들 리빌드 순회하는게 중간에 이전프레임과 똑같은 인스턴스를 마주치면 멈춘다는 얘기.

 

 

 

 

이러한 원리를 공식 유튜브에서도 한번 보여준 적 있다.

 

 

 

영상에 보면 AnimatedBuilder를 AnimatedWidget으로 바꿀 때 child를 받는데

 

AnimatedWidget구현부에는 child가 없다. 즉 직접 만들어줬다는 얘기.

 

 

위에 설명에 나온 ListenableBuilder도 똑같은 원리로 AnimatedWidget을 상속받고, 따로 child를 넣어주었다.

 

 

 

 

또하나 알 수 있는건, Builder라는건 Build메소드를 Builder라는 변수로 외부에서 받아서 build에서 리턴값으로 활용한다는것

 

sdk코드를 까서 공부하면 참으로 많은걸 배울 수 있다.

반응형

댓글