Stateless Widget.. 상태가 없는 위젯
Stateful Widget.. 상태가 있는 위젯??
모두 알다시피 Widget이란 하나의 컴포넌트다. 쉽네~ 여기까지는 오케이
앞에 붙은 State는 상태라는 의미이고, 이건 변수 비슷한 거니까?
변수가 없으면 Stateless, 있으면 Stateful인 건가?
음... 근데 변수가 없는 위젯이란 걸 뭐하러 사용하지...?
내가 처음에 이해했던 과정은 이러했다.
하지만 내 실수는 Widget의 개념을 정확하게 잡지 못한 데서 기인했다.
나는 처음에 아이템 리스트가 있으면 리스트와 그 아래에 추가되는 위젯까지 모두 리스트 위젯이라고 생각했었다.
아이템을 추가하기 위해 리스트의 배열에 아이템을 하나 push 한다고 하면
이 값을 가지고 아이템을 새로 생성해야 하기 때문에 얘네들은 하나의 컴포넌트라고 생각했고,
이 리스트를 가지고 있어야 하는 App 역시 StatefulWidget이지 않나라고 생각했다.
그러나 강의를 들으면서 파일 분리하는 과정을 먼저 알려주는데
이 과정에서 내가 위젯의 개념을 잘못 알고 있다는 것을 알게 되었다.
(아 그래서 Text 하나까지도 위젯으로 따로 만드는구나..)
이런 식으로 Stateless Widget이 Stateful Widget을 가질 수 있으면 된다는 개념이 생기니까
Stateless와 Stateful을 분리하는 이유에 대해서도 더 흥미가 생기기 시작했다.
Stateless는 생성자를 통해서 객체나 값을 전달(Input Data)할 수 있다.
그리고 이 값을 Widget을 통해서 UI로 렌더링 한다.
Input Data가 변하면 Rerendering 한다.
그에 반해 Stateful은 Widget Class와 State Class가 세트처럼 서로 Link 되어 있는 형태를 띤다.
Widget Class의 생성자를 통해 외부에서 값을 받아올 수 있는 건 동일하다.
차이점은 WidgetClass에서 createState를 override 하여 State Class를 Link 한다는 것.
Widget Class의 createState는 State <StatefulWidget>의 return type을 갖는다.
여기서 StatefulWidget은 State를 사용할 자기 자신이다.
createState를 하면 initState를 통해 StateWidget 내부 변수의 값에 적용한다.
그리고 이 StateWidget의 변수들이 변경이 되거나(initState, setState)
Stateless와 마찬가지로 InputData가 변경되면 rendering 한다.
라이프사이클은 아래와 같다.
Stateless는 사실 설명할게 별로 없고,
Stateful의 더 자세한 설명은 아래 링크를 참고하면 좋을 것 같다.
https://flutterbyexample.com/stateful-widget-lifecycle/
Why Are StatefulWidget and State Separate Classes?
In one word: performance.
The tldr version is that State objects are long lived, but StatefulWidgets (and all Widgetsubclasses) are thrown away and rebuilt whenever configuration changes. It's very inexpensive ie cheap for Flutter to rebuild a mutable widget.
As State isn't blown away on every rebuild, it avoids expensive computations, and gets at the states property, getters, setters etc everytime something is rebuilt frame by frame.
Important is that this is what allows Flutter animations to exist. As State isn't thrown away, it can constantly be rebuilding it's Widget in response to data changes, and when required, if any.