반응형
[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
'안드로이드 > 오류, 삽질 및 해결방법' 카테고리의 다른 글
[Android/Unity/Kotlin] 안드로이드 프로젝트 UnityPlayerActivity 실행 에러 (0) | 2023.04.20 |
---|---|
[Android] 안드로이드 스튜디오 2021.2.1 버전 chipmunk firebase realtime-database gradle 설정 (2) | 2022.07.24 |
[Android/Kotlin] Live Data 테스트 오류 (Method getMainLooper in android.os.Looper not mocked.) (0) | 2022.04.14 |
[Android/Kotlin] Koin 라이브러리 설정 문제 (0) | 2022.04.08 |
[Android/Kotlin] Navigation Safe Args 에러 해결 (0) | 2022.02.17 |