Android
Android) Navigation Component IllegalStateException, IllegalArgumentException 예외
가짜 개발자
2021. 6. 10. 20:43
Navigation Component를 사용한 앱을 배포했다가, 다음과 같은 예외를 만나게 되었습니다.
java.lang.IllegalStateException...
java.lang.IllegalArgumentException...
일단 검색을 해본 결과 navigate()를 빠르게 2번 호출, 즉 광클하면 이런 예외가 발생하는 것 같습니다.
1. graph.xml내의 fragment에 종속된 Action을 Global Action으로 바꾸기
- 네비게이션 그래프에서 선언된 action을 전역 action으로 바꾸는 것입니다. (저는 이 방법이 통하지 않았습니다.)
2. RxJava의 debounce 오퍼레이터 이용하여 중복된 이벤트 방지하기
- 중복 클릭을 예방하기 위해 debounce 오퍼레이터를 사용하는 것입니다.
- 혹은 처음 클릭된 시간을 저장하고 잠깐의 간격을 둬 간격보다 적은 시간 동안 다시 클릭이 들어오면 막는 방법도 있겠습니다.
- 저는 이 방법도 통하지 않았습니다.
3. fragment 비교
- 현재 프래그먼트의 id와 이동할 프래그먼트의 id를 비교해 다르면 이동을 실행하는 방법입니다.
- 기존의 navigate 대신 extension을 만들어서 사용합니다.
- 함께 보낼 인자가 있다면 넣어줘도 되고 없다면 안넣어줘도 됩니다.
fun NavController.navigateSafe(
@IdRes resId: Int,
args: Bundle? = null,
navOptions: NavOptions? = null,
navExtras: Navigator.Extras? = null
) {
val action = currentDestination?.getAction(resId) ?: graph.getAction(resId)
if (action != null && currentDestination?.id != action.destinationId) {
navigate(resId, args, navOptions, navExtras)
}
}
private fun startDetailFragment(roomCode: String, date: String) {
val action =
MainFragmentDirections.actionGlobalDetailFragment(
roomCode, date,
host = false,
bookmark = false
)
findNavController().navigateSafe(action.actionId, action.arguments)
}
Preference
IllegalArgumentException: navigation destination xxx is unknown to this NavController
반응형