Safe Navigate Action

DoDoBest

·

2024. 8. 22. 00:53

 

문제 상황 및 해결방법

 

상단의 사진 권한 변경 영역을 클릭하면 Navigation Action을 이용해 ModalBottomSheetFragment가 실행되어 ModalBottomSheet가 보이도록 설정했습니다.

 

 

 

천천히 눌렀을 때는 문제 없었으나, 매우 빠르게 연속해서 누를 경우 아래와 같은 exception이 발생했습니다.

내용을 요악해보면, 현재 ModalBottomSheetFragment에서 호출한 Action이 없기 때문에 처리할 수 없다는 뜻입니다.

Process: com.bestapp.rice, PID: 12707
java.lang.IllegalArgumentException: Navigation action/destination com.bestapp.rice:id/action_profileImageSelectFragment_to_imagePermissionModalBottomSheet cannot be found from the current destination Destination(com.bestapp.rice:id/imagePermissionModalBottomSheet) label=ImagePermissionModalBottomSheet
at androidx.navigation.NavController.navigate(NavController.kt:1691)

 

 

이 exeption이 발생하는 이유는 다음과 같습니다.

  1. ModalBottomSheet Fragment가 action으로 실행되더라도 기존 Fragment는 onResume 상태를 유지하기 때문에 사용자는 UI와 interaction 할 수 있습니다.
  2. action이 실행되면 FragmentManager의 backstack에서 ModalBottomSheetFragment가 최상단에 위치하게 됩니다.

 

2번을 방지하기 위해 Navigation action을 유발하는 listener에서 backstack의 최상단 Fragment가 action의 소유자인지 확인하는 조건문을 추가했습니다.

 

binding.vPermissionRequestBackground.setOnClickListener {
    if (parentFragmentManager.fragments.last() !is ProfileImageSelectFragment) {
        return@setOnClickListener
    }
    val action =
        ProfileImageSelectFragmentDirections.actionProfileImageSelectFragmentToImagePermissionModalBottomSheet()
    findNavController().navigate(action)
}

 

 

그 결과 문제를 해결할 수 있었습니다.

 

 

 

일반 Fragment는 안전할까?

 

위 현상은 ModalBottomSheet와 같이 일부 화면을 가리는 경우가 아닌, 일반적인 Fragment로의 Navigation Action 호출시에도 발생할 수 있습니다. "발생한다"가 아닌 "발생할 수 있다"인 이유는 일반적으로는 발생하지 않기 때문입니다.

 

아무리 빨리 눌러도 IllegalArgumentException이 발생하지 않아, 처음에는 ModalBottomSheet가 화면을 완전히 가리지 않아서 발생한 문제로 추측했습니다.

 

제 손을 믿을 수 없기에 졸라빨라 라는 마우스 클릭 소프트웨어를 이용해 더 빠르게 클릭해봤습니다.

 

 

 

동일하게 IllegalArgumentException이 발생하여 앱이 런타임에 종료되었습니다.
따라서 ModalBottomSheet의 문제가 아닌, Navigation Component Action 호출의 고유 문제임을 알 수 있습니다.

 

 

 

소감

 

이 문제는 프로젝트를 진행하면서 발견하고, 스스로 해결했던 문제입니다.

그런데 해결 직후 이 현상에 대해 교육 프로그램에 계신 튜터 님에게 여쭤보니, 3년 전에 이미 많은 분들이 고민하고 해결방법을 제시했던 문제였습니다.

현업 개발자 분들이 신입에게 큰 기대를 하지 않는 이유가, 이 문제처럼 이미 과거에 경험하고 해결책이 나온 것들이 다수이기 때문 아닐까 라는 생각이 들었습니다.

 

https://github.com/MeetUpEat/Zipbab/discussions/39

 

Navigation Action 사용시 주의사항 · MeetUpEat Zipbab · Discussion #39

관련 커밋 : fix: modalBottomSheet와 Action 관련 exception handling 상단의 사진 권한 변경 영역을 클릭하면 ModalBottomSheet가 보이도록 설정했으며, Navigation Action을 이용해 ModalBottomSheetFragment를 실행했다. bindi

github.com