<aside> 💡 플러터의 모든 위젯은 immutable 즉 불변이다. 위젯은 런타임 도중 수정될 수 없다. 이 말은 렌더링된 위젯을 다른 위젯으로 바꾸고 싶다면 위젯 트리에서 해당 노드를 삭제하고 새로운 노드를 끼워넣는 작업이 이루어진다.

</aside>

[참고링크](https://velog.io/@broccolism/Flutter-이-코드..-%ED%99%94%EB%A9%B4%EC%97%90-%EC%96%B4%EB%96%BB%EA%B2%8C-%EB%A0%A4%EC%A7%88%EA%B9%8C-1.-%ED%8A%B8%EB%A6%AC)

플러터는 3가지의 위젯 트리를 관리한다.

굳이 3가지로 관리하는 이유

플러터는 60fps를 보여주며, 지원 기기에 따라 120fps를 보여줄 수도 있다. 참고

플러터는 미려한 UI를 지원하는 UI 툴킷인 만큼, 그래픽과 성능을 동시에 충족하기 위해 3가지의 트리로 관리한다.

다음 사진은 유저액션부터 GPU 명령 전달까지 플러터의 렌더링 절차를 나타낸다.

https://docs.flutter.dev/resources/architectural-overview#from-user-input-to-the-gpu

https://docs.flutter.dev/resources/architectural-overview#from-user-input-to-the-gpu

플러터가 위젯 트리를 만드는 과정은 다음과 같다.

  1. 3 - build 단계에서 위젯 트리(widget tree)와 엘리먼트 트리(element tree)를 만든다.
  2. 4 - layout 단계에서 렌더 트리(render tree)를 만든다.
  3. 5 - paint 단계에서 만든 렌더 트리를 사용한다.

위 단계에서 각 트리는 위젯 트리 - 엘리먼트 트리 - 렌더 트리 순으로 이전 트리를 참조하여 만들어지고, 사실상 렌더 트리를 만들기 위한 사전 작업이라고 생각하면 된다.

요약하자면, 플러터는 렌더링 성능 확보 차원에서 꼭 필요한 부분만 재빌드 하기 위해 렌더트리가 필요하며, 그 작업을 위해 이전 2개의 트리를 만드는 것이다.