Globalkey 와 const

pharmDev·2024년 12월 15일

GlobalKey를 사용하면 _Time 클래스의 인스턴스를 const로 생성할 수 없는 이유는 GlobalKey가 내부적으로 상태를 유지하기 때문입니다.


1. const 위젯의 특징

  • const 생성자는 불변(immutable)인 위젯을 생성합니다.
    • 위젯의 모든 속성과 상태가 고정되어야 하고, 런타임 중 변경되지 않아야 합니다.
  • const 위젯은 메모리 상에 한 번만 생성되고, 동일한 속성을 가진 다른 위젯들과 공유됩니다.

2. GlobalKeyconst의 충돌

  • GlobalKey는 위젯 트리 내에서 유일해야 하며, 위젯의 상태를 추적하는 데 사용됩니다.
    • 내부적으로 변경 가능한 상태를 관리하고, 이를 통해 Form과 같은 상태 기반 위젯을 제어합니다.
    • 즉, 가변 상태(mutable state)를 가진 객체입니다.
  • const 생성자는 위젯과 관련된 모든 객체가 완전히 불변이어야 하기 때문에, GlobalKey를 사용하는 위젯에서 const를 사용할 수 없습니다.

3. 에러 예시

class _Time extends StatelessWidget {
  final GlobalKey<FormState> formKey = GlobalKey<FormState>();

  const _Time({super.key}); // const 생성자

  
  Widget build(BuildContext context) {
    return Form(
      key: formKey, // 가변 상태를 가진 GlobalKey 사용
      child: Text('Example'),
    );
  }
}
  • 위 코드에서 에러가 발생하는 이유:
    • GlobalKey는 위젯의 상태를 추적하고 가변적인 동작을 수행합니다.
    • 하지만 const로 생성된 _Time 위젯은 불변성을 요구하므로, 가변적인 GlobalKey와 충돌합니다.

에러 메시지 예시:

Const constructor can't be used because 'formKey' isn't a const variable.

4. 해결 방법

  • _Time 클래스의 생성자에서 const를 제거하여 클래스 인스턴스를 일반 객체로 만듭니다.

수정된 코드:

class _Time extends StatelessWidget {
  final GlobalKey<FormState> formKey = GlobalKey<FormState>();

  _Time({super.key}); // const 제거

  
  Widget build(BuildContext context) {
    return Form(
      key: formKey,
      child: Text('Example'),
    );
  }
}

5. GlobalKey와 const를 함께 사용할 수 없는 이유 요약

  1. GlobalKey는 가변 상태를 유지하며, 이를 통해 위젯의 상태를 추적하고 제어합니다.
  2. const는 불변성을 요구하므로, GlobalKey와 함께 사용할 수 없습니다.
  3. GlobalKey를 사용하는 위젯은 항상 비-const로 생성해야 합니다.

6. 추가로 알아두면 좋은 점

  • const는 위젯의 재사용성과 성능을 최적화하기 위해 사용되지만, 상태를 추적하거나 조작하는 위젯에서는 사용할 수 없습니다.
  • 상태 기반 위젯(예: Form, TextFormField)에서는 GlobalKey가 필수적이므로, const 대신 일반 생성자를 사용해야 합니다.

Tip: 만약 GlobalKey가 필요 없는 단순 위젯이라면, const를 적극적으로 활용해 성능을 최적화할 수 있습니다! 😊

profile
코딩을 배우는 초보

0개의 댓글