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에 종속된 ActionGlobal Action으로 바꾸기

  • 네비게이션 그래프에서 선언된 action을 전역 action으로 바꾸는 것입니다. (저는 이 방법이 통하지 않았습니다.)

 

2. RxJavadebounce 오퍼레이터 이용하여 중복된 이벤트 방지하기

  • 중복 클릭을 예방하기 위해 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

반응형