주요 차이점은 상태의 존재 여부에 있습니다.
플러터(Flutter)에서 위젯의 상태는 중요한 개념입니다. 예를 들어, Stateful 위젯은 내부에 상태를 가지고 있고, 이 상태는 위젯이 화면에 어떻게 보여지는지 결정합니다. 상태가 변경되면 화면이 다시 그려져서 사용자에게 업데이트된 내용을 보여줍니다.
Stateless 위젯 (상태가 없는 위젯)
화면이 로드될 때 한 번만 그려지는 State가 없는 위젯으로
변경이 필요한 Data가 없는 것을 의미하며
이벤트 또는 사용자 상호 작용에 의해 동작하지 않는다.
- Stateless 위젯은 상태를 가지지 않으며, 한 번 생성되면 변하지 않습니다.
Stateful 위젯 (상태가 있는 위젯)
위젯이 동작하는 동안 Data 변경이 필요한 경우
화면을 다시 그려서 변경된 부분을 위젯에 반영하는 동적인 위젯으로
이벤트 또는 사용자 상호 작용에 의해 동작한다.
- Stateful 위젯은 내부에 상태를 가지고 있으며, 상태가 변경될 때마다 화면이 다시 그려집니다.
- Stateful 위젯은 State 객체와 함께 사용됩니다. State 객체는 위젯의 상태를 관리하고, 상태가 변경될 때마다 화면을 다시 그리는 로직을 수행합니다.
그럼 stateful 위젯만 사용하면 되지 않나?
Stateless 위젯은 렌더링이 필요한 경우에만 다시 그려지기 때문에 성능이 향상될 수 있습니다.
-
StatelessWidgetSample은 StatelessWidget을 상속하고, build() 함수를 @override 하고 있습니다.
build() 함수는 parameter로 context (context = 부모 Wiget의 정보임)를 받고 있고, Wiget 타입을 return하게 되어 있습니다.
-
StatefulWidgetSample은 StatefulWidget 을 상속 받아서 _createState() 함수를 @override하고 있습니다.
_createState() 함수는 _StatefulWidgetSampleState() Class를 생성하고, 이는 State을 상속 받아 build() 함수를 @override 합니다.
Stateful 위젯은 _createstate() 메소드로 State(상태)를 생성합니다.
Lifecycle 생명주기
Stateful Widget
createState()
- Stateful Widget 객체를 생성하면 생성자가 호출되고 이 메서드가 호출된다. Stateful Widget 에서 필수적으로 오버라이드 해야 하는 메서드이다. 이 메서드의 역할은 State 객체를 생성하는 일이다.
initState()
- State 객체가 생성되면 State 객체의 생성자가 호출된다. 이렇게 위젯이 최초 생성되는 상황이면 이 메서드가 호출된다. 처음 한 번만 호출되는 함수이다. 여기서 데이터나 속성값을 초기화 할 수 있다.
didChangeDependencies()
- initState() 다음에 실행되는 메서드. 추가적으로 위젯이 의존하는 데이터의 객체가 호출될 때 호출 되기도 한다. Inherited Widget 을 사용하는 경우가 대표적이라고 할 수 있다.
build()
- build()를 통해서 위젯이 그려진다. State 클래스에서 반드시 오버라이딩 되어야 하는 메서드이다. 예를 들어 버튼을 클릭 할 때나 어떠한 액션을 취할 때 계속 실행되는 함수이다.
setState()
- State 객체의 상태가 변경되었다는 것을 프레임워크에 알리는 용도이다. 따라서 State 객체의 상태가 변경될 때마다 setState() 함수를 통해서 알려야 한다. 그래야만 프레임워크가 build() 함수가 호출할 준비를 한다.
didUpdateWiget()
- 부모 위젯이 재 빌드되어 위젯이 갱신될 때 호출된다. didUpdateWiget()이 호출된 후에는 항상 build()를 호출한다. 따라서 만약 didUpdateWiget() 내에서 setState() 를 호출하면 build() 중복 호출이 된다.
deactivate()
- 트리에서 State 객체가 제거될 때마다 호출된다. 어떤 경우에는 프레임워크가 제거된 State 객체를 트리의 다른 부분에 다시 삽입하기도 한다. 이 경우에는 State 객체가 트리의 새로운 위치에 적응할 수 있는 기회를 주기 위해 build()를 호출한다.
dispose()
- 해당 위젯이 위젯트리에서 제거됐을 때 실행된다. 더이상 빌드되지 않는다는 의미이다.
reassemble()
- hot reload 를 실행하면 reassemble()이 호출된다. reassemble() 이 호출되면 build()도 호출이 된다.