티스토리 뷰

 

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) => ...;
}

 

기본적으로 상태를 계속 유지해야 되는 경우 해당 믹스인을 이용해서 상태를 계속 유지할 수 있게 해줘야 합니다.


만약 이러한 작업을 해주지 않게 된다면 수 많은 위젯들이 다시 불필요하게 빌드되는 상황이 생깁니다.