티스토리 뷰
플러터 (Flutter)
[Flutter] 위젯이 화면 상에서 사라지거나 위젯 트리 상에 존재하지 않았을 때도 상태를 유지하는 방법
Dev Ttangkong 2023. 2. 13. 23:35
Stateful 위젯은 화면 상에서 사라지거나 위젯 트리 상에 존재하지 않으면(보통 dirty widget 이라고 부릅니다.) 위젯의 상태가 Dispose(폐기)되어 아무런 조치를 취하지 않는다면 상태를 유지할 수 없습니다.
해당 위젯을 다시 빌드하려고 한다면 기존에 존재하던 상태가 아니라 초기 값을 지닌 상태를 기반한 위젯이 빌드될 것입니다.
이렇게 되는 원인은 "메모리 관리와 효율성을 위해서"입니다.
모든 위젯의 상태들이 위젯 트리에 없더라도 메모리에서 불필요하게 존재한다면 생각만 해도 이는 굉장히 비효율적인 상황인 것이죠.
하지만 예외의 상황은 항상 있는 법, 이를 방지하는 방법은 매우 간단합니다.
위젯의 상태 클래스를 AutomaticKeepAliveClientMixin로 확장하여 이를 해결할 수 있습니다.
해당 믹스인은 이름에서도 알 수 있다시피 위젯의 상태를 자동적으로 유지하는 기능을 제공합니다.
// 위젯의 선언부는 생략합니다.
class _ExampleWidgetState extends State<ExampleWidget> with AutomaticKeepAliveClientMixin {
/// 해당 Getter는 현재 위젯의 상태를 유지하고 싶은지를 반환합니다.
///
/// 특정 상황에서 위젯의 상태를 유지하고 싶지 않을 때는 false로 반환하면 됩니다.
/// 현재 상황에서는 계속해서 해당 위젯의 상태를 유지하고 싶으니 선언적으로 true를 반환합니다.
@override
bool get wantKeepAlive => true;
@override
Widget build(BuildContext context) => ...;
}
기본적으로 상태를 계속 유지해야 되는 경우 해당 믹스인을 이용해서 상태를 계속 유지할 수 있게 해줘야 합니다.
만약 이러한 작업을 해주지 않게 된다면 수 많은 위젯들이 다시 불필요하게 빌드되는 상황이 생깁니다.
'플러터 (Flutter)' 카테고리의 다른 글
[Flutter] 플러터를 모에화해보자~ (플러터짱 with AI) (0) | 2024.07.29 |
---|---|
[Flutter] Ticker에 대하여 (1) | 2023.06.12 |
[Flutter] 자식 위젯의 제스처 또는 포인터 수신을 막는 방법 (0) | 2023.02.12 |
[Flutter] 상태가 변화하지 않았어도 모든 위젯을 강제로 리빌드시키는 법 (모든 위젯을 리빌드) (0) | 2023.02.02 |
[Flutter] 자식 위젯의 State 또는 부모 위젯의 State를 참조하는 방법 (0) | 2023.01.30 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 아이콘 템플릿
- android
- TypeScript
- webpack
- omit
- 객체 지향
- 무료 svg 툴
- 깃허브 터짐
- 최적화
- svg 툴
- typescript-preact-webpack
- 디자인 패턴
- 객체지향
- 아이콘 개발
- 깃허브
- web
- mangler
- 타입스크립트
- github
- 안드로이드
- jetpack compose
- Flutter
- JavaScript
- 안드로이드 개발
- 조건부 타입
- svg
- html-inline-webpack-plugin
- Reflow
- 팩토리 메서드
- Factory Method
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
글 보관함