Jetpack Compose 뒤로가기 이벤트 처리하기

BackHandler 함수 알아보기

Ji Sungbin
성빈랜드
3 min readJan 26, 2022

--

Photo by Conor Samuel on Unsplash

시작하기 앞써, 뒤로가기 이벤트 의 역사를 재미로 먼저 알아보자. 뒤로가기 이벤트라면 제일 먼저 Activity의 onBackPressed를 떠올릴 것이다. 이건 2015년 API 5 에서 추가됐고, 아쉽게 Fragment에서는 사용하지 못한다. 인터페이스로 따로 만들어서 구현하는 방법도 있긴 했지만 이는 여러모로 문제가 있던 방법이였다. 그래서! 구글도 역시 이를 문제라고 생각하고 있었는지 OnBackPressedDispatcher 라는게 나왔다. 얘를 써서 Fragment에서도 손쉽게 뒤로가기 이벤트를 처리할 수 있다.

그럼 Compose에서 뒤로가기는?

난 지금까지 아래와 같은 방법으로 하고 있었다.

뒤로가기 이벤트를 받았을 때 실행할 함수 변수? 를 lateinit으로 선언해 두고, composable 안에서 초기화를 해주는 방식이였다.

하지만 이런 방법으로 composable에 영향이 가지 않는 코드면 상관이 없으나, composable에 영향을 끼치는 (예를 들어 scaffold의 state 변경) 코드를 실행하게 되면 아래와 같은 에러와 직면하게 된다.

맨 처음엔 clock?? 시계?? 하면서 이상한 에러라고 의아해 했는데, 찾아보니 MonotonicFrameClock는 compose에서 프레임 관련 작업을 하는데 사용되는 인터페이스 라는걸 알 수 있었다. 이를 통해 composable를 composable scope가 아닌 다른 scope에서 만지니 생긴 오류라고 유추할 수 있다.

BackHandler

따라서 우린 아래와 같이 생긴 BackHandler 라는 composable을 사용해야 한다.

BackHandler는 androidx.activity.compose에 내장돼 있는 함수이다. 뒤로가기 이벤트가 감지 됐을 때 enabled이 true면 onBack() 을 실행하게 된다.

아래와 같이 적절히 enabled를 관리해주면서 사용해야 한다.

12번째 줄을 보면 된다. scaffold를 쓰고 있다면 저런식으로 쉽게 할 수 있다. 만약 BackHandler를 여러 composable에서 쓴다면 가장 안쪽에 있는 BackHandler가 작동하게 된다.

끝!

제 글을 봐주시는 분들 모두 감사합니다.

모바일(Android/iOS) 개발자 분들을 위한 카카오톡 오픈 채팅방을 운영하고 있습니다.

--

--

Ji Sungbin
성빈랜드

Experience Engineers for us. I love development that creates references.