Flutter 앱에서 iOS 키보드 오버레이 문제 해결

문제 상황

채팅 기능을 구현하던 중 iOS 기기에서 키보드가 올라올 때 하단 입력창이 키보드에 가려지는 문제가 발생했다. Android에서는 정상 동작했지만 iOS에서만 재현되었다.

시도한 방법들

먼저 ScaffoldresizeToAvoidBottomInset 속성을 true로 설정했다.

Scaffold(
  resizeToAvoidBottomInset: true,
  body: ChatScreen(),
)

그러나 여전히 키보드가 입력창을 가렸다. 특히 SafeArea 내부에서 Column 구조로 레이아웃을 잡았을 때 문제가 심했다.

해결 방법

MediaQuery.of(context).viewInsets.bottom을 활용해 키보드 높이만큼 padding을 추가했다.

Widget build(BuildContext context) {
  final bottomInset = MediaQuery.of(context).viewInsets.bottom;
  
  return Scaffold(
    resizeToAvoidBottomInset: false,
    body: Column(
      children: [
        Expanded(child: MessageList()),
        Container(
          padding: EdgeInsets.only(bottom: bottomInset),
          child: MessageInput(),
        ),
      ],
    ),
  );
}

핵심은 resizeToAvoidBottomInset을 false로 두고, 직접 viewInsets 값을 이용해 padding을 조절하는 것이었다. 이렇게 하니 iOS에서도 키보드가 올라올 때 입력창이 자연스럽게 따라 올라갔다.

추가 개선

Keyboard Visibility 패키지를 사용해 키보드 상태를 감지하고, 애니메이션을 추가했다.

AnimatedPadding(
  padding: EdgeInsets.only(bottom: bottomInset),
  duration: Duration(milliseconds: 200),
  curve: Curves.easeOut,
  child: MessageInput(),
)

단순한 문제였지만 Flutter의 iOS 키보드 처리 방식을 이해하는 데 도움이 되었다.