Navigation Action 사용시 주의사항 #39
Replies: 2 comments
-
Modal Bottom Sheet가 아닌 일반 Fragment로의 Action을 호출하는 것도 안전하지 않다. Action을 호출하는 즉시 Destination으로 이동된 것으로 간주된다. Action 호출과 Current, Destinatino Frgament의 Lifecycle callback 함수 로그를 찍어보면 다음과 같다. ivProfileImage.setOnClickListener {
if (isNotLoadingYet) {
showNotYetLoaded(getString(R.string.user_info))
return@setOnClickListener
}
val action = if (userUiState.isLoggedIn) {
SettingFragmentDirections.actionSettingFragmentToProfileFragment(userUiState.userDocumentID)
} else {
SettingFragmentDirections.actionSettingFragmentToLoginFragment("")
}
Log.i("TEST", "try cation call")
findNavController().navigate(action)
Log.i("TEST", "call cation done")
} 직접 빨리 눌러도 IllegalArgumentException이 발생하지 않아, ModalBottomSheet가 화면을 완전히 가리지 않아서 발생하는 문제인가 추측했다. 졸라빨라 라는 마우스 클릭 소프트웨어를 이용해 더 빠르게 클릭해봤다. 동일하게 IllegalArgumentException이 발생하는 것을 볼 수 있다. |
Beta Was this translation helpful? Give feedback.
-
관련 키워드 : android jetpack navigation safe navigate https://vadzimv.dev/2021/07/26/android-jetpack-navigation-navigate-safe.html |
Beta Was this translation helpful? Give feedback.
-
관련 커밋 : fix: modalBottomSheet와 Action 관련 exception handling
상단의 사진 권한 변경 영역을 클릭하면 ModalBottomSheet가 보이도록 설정했으며, Navigation Action을 이용해 ModalBottomSheetFragment를 실행했다.
천천히 눌렀을 때는 상관 없었으나, 매우 빠르게 연속해서 누를 경우, 아래와 같은 exception이 발생했다. 내용을 요악해보면, 현재 ModalBottomSheetFragment에서 호출한 Action이 없다는 것이다.
이 exeption이 발생하는 이유는 ModalBottomSheet Fragment가 action으로 실행되더라도 기존 Fragment는 onResume 상태를 유지되기 때문이다. ModalBottomSheet Framgment가 내려가기 시작하는 시점에 호출한 Fragment에 click event가 가기 시작하는데, 이때 FragmentManager의 backstack 상으로 ModalBottomSheetFragment가 최상단이다.
그래서 아래와 같이 현재 BackStack의 최상단 Fragment가 호출한 Fragment가 맞는지 확인하는 조건문을 걸어놨다.
Beta Was this translation helpful? Give feedback.
All reactions