
Win32에서 web, aos, ios에 이르기까지 대부분 imperative style을 사용한다.
완전한 기능을 갖춘 UI 엔티티를 만든 후, UI 변경이 필요할 때 메서드나 setter로 조작한다.
플러터는 UI 상태를 바꾸는데 드는 비용을 줄이도록 설계되었다.
현재 UI 상태를 선언하면, 플러터가 알아서 상태 전환이 필요할 때마다 바꾼다.
// Imperative style
b.setColor(red)
b.clearChildren()
ViewC c3 = new ViewC(...)
b.add(c3)
imperative style에서는 ViewB에 접근하기 위해서는 인스턴스 b를 생성해야 한다.
또한, 인스턴스가 있어야 뭐라도 할 수 있기 때문에 항상 들고 다녀야 한다.
반면, declarative style은 immutable을 가진다.
UI를 변경하기 위해서는 다시 새로 만들어야 한다.
// Declarative style
return ViewB(
color: red,
child: const ViewC(),
);
mutate인 인스턴스 b를 사용하는 대신, 플러터는 새로운 위젯 인스턴스를 만든다.
플러터는 뒷단에서 RenderObjects와 함께 UI object를 관리한다.
(ex. layout의 state 관리 등)
RenderObjects는 프레임 간에 지속된다.
또한, lightweight 위젯은 상태 변화에 따라 RenderObjects에게 상태를 변경하라고 지시한다.
나머지는 플러터가 처리한다.
lightweight 위젯은 상태를 immutable하게 유지하는 위젯을 말한다.
위젯은 단순히 UI의 상태를 설명하는 역할만 한다.
실제 UI 렌더링 및 상태 관리는 RenderObjects와 Element가 한다.Widget Tree(lightweight) - Element Tree - RenderObject Tree(heavy)