728x90
https://youtube.com/shorts/u_hzF982xbI?feature=share
배경
초중고 학생들을위한 체력측정 앱 개발 중에, 키보드 위에 확인 버튼위젯을 고정할 일이 생겼는데 이슈들이 발생해서 정리하고자 한다.
요구사항
1. 키보드 바로 위에 '확인' 버튼이 있어야 함
2. 키보드에 입력 데이터가 가려지면 안됨
3. 버튼을 선택할 때 키보드가 없어져야 함
해결방법
double bottomViewInsets = MediaQuery.of(context).viewInsets.bottom;
bool keyboardOn = bottomViewInsets != 0; // 키보드 존재 여부 판단
키보드가 올라가면 키보드의 높이만큼 bottomViewInsets이 증가하는 점을 이용해 키보드가 올라왔는지 파악할 수 있다.
keyboardOn
? Align(
alignment: Alignment.bottomCenter,
child: InkWell(
onTap: () async {
int index = controller.registerStateIndex.value;
FocusNode focusNode = controller.focusNodeList[index];
if (focusNode.hasFocus) {
controller.nextStep();
Future.delayed(const Duration(milliseconds: 100), () {
int index = controller.registerStateIndex.value;
FocusNode focusNode = controller.focusNodeList[index];
FocusScope.of(context).requestFocus(focusNode);
});
} else {
FocusScope.of(context).unfocus();
}
},
child: Container(
width: 375.w,
height: 56.h,
decoration: const BoxDecoration(
color: kPrimaryColor,
),
child: Center(
child: Text(
'확인',
style: kNextButton1.copyWith(color: kWhiteColor),
),
),
),
),
)
: const SizedBox.shrink(),
키보드가 올라왔을 때만 "확인" 버튼을 보여주면 되므로, keyboardOn 변수로 분기처리를 해준다.
여기서 다음 입력할 필드가 텍스트임에도 불구하고 키보드가 내려가는 문제가 있었는데,
원인은 controller.nextStep(); 시 포커싱할 포커스 노드의 index의 값이 1이 증가하는데, UI가 rebuild 되므로 아래코드의 index에 반영되기 까지 시간이 걸려서 Delay를 100ms 주어서 해결했다.
Align(
alignment: Alignment.bottomCenter,
child:
)
Alignment.bottomCenter 를 사용하면 맨 아래에 위젯이 배치되므로, CustomScrollView 바깥에 위젯을 배치했다.
Next To do
학교정보 검색, 선택 화면 개발
이메일 인증, 비밀번호 입력 화면 개발
'개발 > Flutter' 카테고리의 다른 글
Flutter 츠누봇 [Pull Request] :: clean & 3-layered architecture 적용 (0) | 2022.12.07 |
---|---|
Flutter 츠누봇 [Pull Request] :: 의존성 추가, 화면 비율 설정 (0) | 2022.12.07 |
Flutter Firestore 구조 (1) | 2021.12.31 |
Flutter + Firebase 채팅 기능 시연 (0) | 2021.12.29 |
Flutter Devtools 개념 이해 (1) | 2021.12.28 |