TL;DR Flutter renders by maintaining three parallel trees. The Widget tree is immutable configuration, rebuilt on every setState . The Element tree is the persistent identity layer that decides whether to update or replace. The RenderObject tree is the heavyweight layout, paint, and hit-test machine. Bugs that look like "random state loss" or "ListView jank" almost always live in the Element layer. Why three trees instead of one If Flutter rebuilt the entire rendered UI on every state change, no app would hold 60fps. Native frameworks solve this with mutable view objects you imperatively update. React solves it with a virtual DOM diff against a real DOM. Flutter splits the problem into three layers, each with one job. Widgets are immutable build instructions. They are cheap to allocate, cheap to throw away, and trivially comparable. When you call setState , Flutter does not rebuild any pixels. It rebuilds the widget subtree below the StatefulWidget into fresh widget instances.…