[Jetpack Compose] BasicTextField - clearFocus() 이슈개발/Android2022. 7. 11. 02:03
Table of Contents
Error Log
layoutcoordinate operations are only valid when isattached is true
시나리오
- BasicTextField 생성
- decorationBox안에 value(입력 값)이 empty이 아니면 innerTextField를 호출하지 않도록 함
- 키보드 엔터 누른 경우 search를 하고 키보드 숨김 및 focusManager로 clearFocus 호출
- 이때 text가 비어있는 상태에서 키보드 숨김 및 focus 해제 후 다시 BasicTextField를 클릭하면
- 앱 사망
분석
- clearFocus() 함수의 문제인가?
- clearFocus() 함수를 호출하고 이후 호출을 하지 않더라도 앱이 사망
- 키보드가 내려간 상태에서 textField를 클릭하였기 때문에 오류가 난건가?
- 키보드 관련 로직을 지우더라도 재현됨
- 구글링 해보니 Compose 자체 이슈라는 글들이 보임
(다른 기능 구현 중 발생한 이슈들이지만 컴포즈 xxx에서 해결되었다함)- Compose 1.2.0-alpha02 / Kotlin 1.6.10 업데이트하고 다시 해보았지만 사망
- 도대체 무엇이 문제인가…?
해결
- 혹시나 하는 마음에 decorationBox에 innerTextField를 반드시 반환 되도록 수정
- 잘 작동됨
원인 추측
- Material 디자인을 채택하지 않는 경우에는 BasicTextField를 사용해야함
- 특히 Hint 등 유연하게 디자인을 하기 위해서는 deocrationBox를 사용함
- decorationBox안에서 특정한 디자인 후 innerTextField()를 호출하면 텍스트 필드가 생성됨
- 이때 value(입력 값)이 empty가 아닌 경우에만 innerTextField()를 호출하도록 설정되었음
- value가 empty이었기에 innerTextField()가 호출되지 않았고, 이 상태에서 clearFocus()가 호출되면서 해당 BasicTextField는 focus가 해제됨
- 이 상태에서 BasicTextField를 클릭함으로써 focus를 주려고 하였지만, innerTextField가 없었기에 focus 대상을 찾지 못함
- 그로 인해 사망
결론
- 아래의 3가지 조건 중 하나를 사용해야함
- BasicTextField에서 decroationBox 사용 시 innerTextField()는 반드시 존재해야함
- 반드시 입력 창이 존재하지 않아야 한다면, innerTextField 부모로
Modifier.size(0)을 두는 꼼수를 사용해야할 듯.- (태환님 제보) 1.4.0-alpha04 부터는 size가 0.dp 인 경우 Exception이 발생하므로 최소 1.dp를 주어야 합니다.
- 또는 decorationBox에서 분기하는 것이 아닌, BasicTextField 자체를 보여줄지 말지 분기 필요
최초 작성일: 2022. 02. 17
'개발 > Android' 카테고리의 다른 글
[Room DB] Room Database 마이그레이션 시 주의점 2가지 (0) | 2022.12.05 |
---|---|
PopupWindow에서 Jetpack Compose를 사용하는 방법 (1) | 2022.11.04 |
안드로이드 gRPC 개념 및 사용법 (2) | 2022.10.12 |
MQTT 안드로이드 코틀린 클라이언트 + 서버 만들기 (2) | 2022.09.27 |
안드로이드12 대응 - PendingIntent 빌드 오류 (0) | 2022.07.11 |
@귀염둥이 팡무 :: HolyKisa
상상하는 것을 소프트웨어로 구현하는 것을 좋아하는 청년
게시글이 마음에 드시나요? [ 공감❤️ ] 눌러주시면 큰 힘이 됩니다!