[Flutter] Flutter 속 작은 배려, MediaQuery로 완성하는 따뜻한 화면

서연·2025년 10월 27일
post-thumbnail

📖 MediaQuery

  • 앱이 실행되는 현재 디바이스와 환경 정보를 얻기 위해 사용되는 위젯이다.
  • 이는 단순히 웹의 CSS MediaQuery처럼 반응형을 위한 역할을 넘어 Flutter 위젯 트리 내에서 환경적 제약 조건을 인식하고 UI를 동적으로 조정하는 핵심 도구이다.
  • MediaQuery는 화면의 맥락을 파악하고 그에 따라 UI를 반응형으로 조정하는 기반이다.

⚙️ 작동 원리

  • MediaQuery.of(context)를 호출하면 현재 위젯이 속한 BuildContext를 기준으로 해당 시점의 화면 정보가 담긴 MediaQueryData 객체를 반환한다.
  • 이 객체는 화면 회전, 키보드 등장, 시스템 UI 변경 등 환경 변화가 감지될 때마다 자동으로 업데이트되어 이를 사용하느 위젯이 자동으로 리빌드된다.

📏 주요 속성 정리

size

  • 논리 픽셀 기준의 화면 크기 (가로 • 세로), 반응형 비율 계산의 기준

Orientation

  • Portrait / landScape 값으로 화면 방향에 따라 열 수 • 배치 분기 결정

devicePixelRatio

  • 물리 픽셀 대비 논리 픽셀 비율
  • 정밀한 그래픽 드로잉에 사용

Padding

  • 상태 바 • 홈 인디케이터 등 항상 가려지는 시스템 영역
  • safeArea가 활용

viewPadding

  • 키보드 유무와 관계없는 영구 시스템 패딩
  • 상단 상태 바 높이 확인 시 사용

viewInsets

  • 키보드처럼 일시적으로 침범하는 영역
  • viewInsets.bottom으로 키보드 높이 확인

textScaler(textScaleFactor)

  • 접근성 설정에 따른 폰트 크기 비율
  • 텍스트 및 버튼 UI의 균형 유지

platformBrightness

  • 시스템의 라이트 / 다크 모드 상태 반환
  • Theme.of(context).brightness로 관리 권장

🛟 safeArea와의 관계

  • MediaQuery.padding은 iOS의 노치, Android의 상태 표시줄처럼 시스템 UI에 의해 가려지는 영역을 알려준다.
  • safeArea는 내부적으로 이 값을 이용해 콘텐츠가 항상 시스템 UI에 가려지지 않게 안전하게 표시되도록 자동 처리한다.

⌨️ 키보드 대응

  • MediaQuery.viewInsets.bottom은 소프트 키보드가 올라올 때의 높이를 알려준다.
  • 이를 이용하면 입력창이 키보드에 가려지지 않도록 화면을 자연스럽게 올릴 수 있다.
final keyboardHeight = MediaQuery.viewInsetsOf(context).bottom;

return Padding(
padding: EdgeInsets.only(bottom: keyboardHeight),
child: TextField(...),);

🔁 자동 리빌드 특징

  • MediaQuery.of(context)는 상속된 위젯의 일종이다.
  • 따라서 기기가 가로 ↔︎ 세로 회전, 시스템 글자 크기 변경, 키보드 등장 등 환경이 바뀌면 관련 위젯이 자동으로 리빌드된다.
// MediaQuery: 현재 디바이스의 정보를 가져오는 도구
// .sizeOf(context): 화면의 크기 정보
// .width: 가로 길이만 가져오기
final deviceWidth = MediaQuery.sizeOf(context).width;

💡 정리

  • MediaQuery는 Flutter 반응형 UI의 출발점이다.
  • 화면 크기, 방향, 안전 영역, 키보드, 접근성 등 모든 환경적 정보를 담은 핵심 객체로 이를 기반으로 디바이스마다 유연하게 적응하는 UI를 구현할 수 있다.

0개의 댓글