Flutter document를 참조해서 위젯과 관련된 유용한 정보들을 요약했습니다.
요약한 정보이기 때문에 확실한 이해는 실제 코딩을 해보면서 깨우치는 것이 필요합니다.
flutter의 위젯은 Layout widget과 Visible widget으로 구분할 수 있다. LW은 Container, Center와 같은 위젯처럼 child나 children property가 있는 위젯이다. VW은 Text, Image 같은 위젯들이다. 그래서 일반적으로 LW이 VW을 감싼 형태다.
사용자의 이벤트에 따라 위젯이 변한다면 stateful, 변하지 않는다면 stateless widget이다.
state object에 위젯의 상태와 위젯의 모양이 저장된다. state object에는 변경될 수 있는 값들로 구성되어 있고, setState를 호출해서 framework에게 위젯들을 다시 그리도록 할 수 있다.
위젯의 상태를 관리하는 방법은 크게 세가지가 있습니다. 어떤 방법을 선택할지는 위젯 디자이너의 결정에 달려있습니다.
1. 위젯 스스로가 상태를 관리하는 법
2. 부모 위젯이 관리하는 법
3. 1번과 2번을 혼합하여 관리하는 법
어떤 방법을 사용할지는 위젯 디자이너의 선택의 몫이지만 만약에 체크박스의 선택 여부라던지, PageView의 position 값 같은 것이라면 부모가 상태를 관리하는 것이 좋습니다. 이와 다르게 애니메이션 같은 디자인적/미학적인 부분이라면 위젯 자신이 상태를 관리하는 것이 좋습니다. 구분이 확실치 않다면 부모 위젯이 관리하는 것을 추천합니다.
또한 버튼 클릭 같은 기능인 경우 부모가 해당 클릭의 시점과 특정 데이터들을 알아야 한다면 property로 함수를 추가하는 것도 좋은 방법이다.
Flutter 개발자들은 화면 작업을 하면서 overflow 에러를 자주 볼 것이다. 그리고 특정 위젯이 원하는 위치와 사이즈로 그려지지 않아서 많은 시간을 할애 할 것이다. 이러한 어려움을 이겨내기 위해서는 아래의 규칙을 배워야 한다.
flutter의 위젯 트리를 어떻게 구성하고 있냐고 질문하면 아래의 문장이 가장 깔끔한 답변이다. 물론 이 룰을 이해하지 못한 경우에는 무슨 뜻인지 알 수 없을 것이다.
Constraints go down. Sizes go up. Parent sets position.
Flutter의 layout engine은 몇 가지의 제한을 두고있다.
tight constraints는 min/max값이 동일하다.
minimun width = maximum width, minimum height = maximum height
반면 loose constrains는 min/max값이 다르다.