안드로이드/오류, 삽질 및 해결방법

[Android] Hilt 라이브러리 Fragment 버전 호환 이슈

감자 바보 2023. 3. 20. 20:36
반응형

[Android] Hilt 라이브러리 Fragment 버전 호환 이슈

  안드로이드 개발 중 Hilt를 사용하여 Retrofit 통신 코드를 작성하던 중 예기치 못한 오류가 발생했습니. 에러 코드와 원인, 그리고 해결 방법에 대해 정리할 것입니다.

 

에러 코드

 

FATAL EXCEPTION: main
                 Process: com.nassafy.aro, PID: 6101
                 java.lang.IllegalArgumentException: CreationExtras must have a value by `SAVED_STATE_REGISTRY_OWNER_KEY`
                 	at androidx.lifecycle.SavedStateHandleSupport.createSavedStateHandle(SavedStateHandleSupport.kt:91)
                 	at androidx.lifecycle.AbstractSavedStateViewModelFactory.create(AbstractSavedStateViewModelFactory.java:89)
                 	at dagger.hilt.android.internal.lifecycle.HiltViewModelFactory.create(HiltViewModelFactory.java:114)
                 	at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:187)
                 	at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:153)
                 	at androidx.lifecycle.ViewModelLazy.getValue(ViewModelLazy.kt:53)
                 	at androidx.lifecycle.ViewModelLazy.getValue(ViewModelLazy.kt:35)
                 	at com.nassafy.aro.ui.view.ServerCallTestFragment.getServerCallTestViewModel(serverCallTestFragment.kt:29)
                 	at com.nassafy.aro.ui.view.ServerCallTestFragment.getServerCallTestObserve(serverCallTestFragment.kt:57)
                 	at com.nassafy.aro.ui.view.ServerCallTestFragment.initObserve(serverCallTestFragment.kt:53)
                 	at com.nassafy.aro.ui.view.ServerCallTestFragment.onViewCreated(serverCallTestFragment.kt:43)
                 	at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:3128)
                 	at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:552)
                 	at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:261)
                 	at androidx.fragment.app.FragmentStore.moveToExpectedState(FragmentStore.java:113)
                 	at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1424)
                 	at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2968)
                 	at androidx.fragment.app.FragmentManager.dispatchViewCreated(FragmentManager.java:2879)
                 	at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:3129)
                 	at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:552)
                 	at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:261)
                 	at androidx.fragment.app.FragmentStore.moveToExpectedState(FragmentStore.java:113)
                 	at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1424)
                 	at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2968)
                 	at androidx.fragment.app.FragmentManager.dispatchViewCreated(FragmentManager.java:2879)
                 	at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:3129)
                 	at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:552)
                 	at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:261)
                 	at androidx.fragment.app.FragmentStore.moveToExpectedState(FragmentStore.java:113)
                 	at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1424)
                 	at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2968)
                 	at androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:2886)
                 	at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:263)
                 	at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:351)
                 	at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:251)
                 	at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1435)
                 	at android.app.Activity.performStart(Activity.java:8018)
                 	at android.app.ActivityThread.handleStartActivity(ActivityThread.java:3475)
                 	at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:221)
                 	at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:201)
                 	at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:173)
                 	at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
                 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)
                 	at android.os.Handler.dispatchMessage(Handler.java:106)
                 	at android.os.Looper.loop(Looper.java:223)

 

에러 원인

 

  androidx.fragment:fragment-ktx:1.4.1 라이브러리 문제였던 것 같습니다. 1.4.1 버전은 힐트가 지원 안 하는 듯..?

androidx.fragment:fragment-ktx:1.4.1

  

 

 

해결 방법

 

 그나마 최신 버전인 androidx.fragment:fragment-ktx:1.5.4 버전으로 업데이트 하니 문제가 해결되었습니다. Hilt 공식문서를 보면 아래와 같이 공지되어 있어 버전 문제없을 줄 알았지만... 아니었던 걸로.. (공식 문서 업데이트 좀 해라 이 놈들아..)

 


참고: Android 클래스에 관한 Hilt 지원에는 다음과 같은 예외가 적용됩니다.

  • Hilt는 AppCompatActivity와 같은 ComponentActivity를 확장하는 활동만 지원합니다.
  • Hilt는 androidx.Fragment를 확장하는 프래그먼트만 지원합니다.
  • Hilt는 보존된 프래그먼트를 지원하지 않습니다.



참고

https://holykisa.tistory.com/85

 

컴포즈 내비게이션 CreationExtras must have a value by `SAVED_STATE_REGISTRY_OWNER_KEY` 오류

오류 로그 java.lang.IllegalArgumentException: CreationExtras must have a value by `SAVED_STATE_REGISTRY_OWNER_KEY` 오류 시나리오 현재 GDSC TUK(Google Developer Student Clubs - TECH UNIVERSITY OF KOREA)에서 2022년 안드로이드 스터디

holykisa.tistory.com