오늘 "아키텍처를 알아야 앱 개발이 보인다" 라는 책을 공부하던 중, 한가지 이슈에 직면했다.
ViewModel 파트 실습중이였는데, gradle 설정을 완료하였음에도
ViewModel 생성을 위한 ViewModelProvider 클래스가 생성되지 않는 이슈였다.
수정을 거쳐도 이미 deprecated된 ViewModelProviders가 나오거나 아예 엉뚱한 HasDefaultViewModelProvideFactory 였나? 뭔가 하는 이상한 클래스가 나왔다.
아래 코드는 developers에서 제공하는 최신 버전의 gradle이다.
dependencies {
def lifecycle_version = "2.6.0-alpha01"
def arch_version = "2.1.0"
// ViewModel
implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version"
// LiveData
implementation "androidx.lifecycle:lifecycle-livedata:$lifecycle_version"
// Lifecycles only (without ViewModel or LiveData)
implementation "androidx.lifecycle:lifecycle-runtime:$lifecycle_version"
// Saved state module for ViewModel
implementation "androidx.lifecycle:lifecycle-viewmodel-savedstate:$lifecycle_version"
// Annotation processor
annotationProcessor "androidx.lifecycle:lifecycle-compiler:$lifecycle_version"
// alternately - if using Java8, use the following instead of lifecycle-compiler
implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"
// optional - helpers for implementing LifecycleOwner in a Service
implementation "androidx.lifecycle:lifecycle-service:$lifecycle_version"
// optional - ProcessLifecycleOwner provides a lifecycle for the whole application process
implementation "androidx.lifecycle:lifecycle-process:$lifecycle_version"
// optional - ReactiveStreams support for LiveData
implementation "androidx.lifecycle:lifecycle-reactivestreams:$lifecycle_version"
// optional - Test helpers for LiveData
testImplementation "androidx.arch.core:core-testing:$arch_version"
// optional - Test helpers for Lifecycle runtime
testImplementation "androidx.lifecycle:lifecycle-runtime-testing:$lifecycle_version"
}
최신 버전은 2.6.0-alpha01 으로 되어있으나, 해당 버전에서는 ViewModelProvider를 사용할 수 없었다.
다른 글들을 찾아보니, 내가 사용중인 gradle 4.3.0 버전과 lifecycle 라이브러리의 버전에 충돌이 일어나서 그런 것이라고 한다.
해당 글에서는 viewmodel 2.4.3 버전을 적용해서 해결했다는데, 이상하게 나는 또 해결이 되지 않았다.
dependencies {
.
.
.
//Dagger2
implementation 'com.google.dagger:dagger:2.27'
implementation 'com.google.dagger:dagger-android-support:2.27'
annotationProcessor 'com.google.dagger:dagger-compiler:2.27'
annotationProcessor 'com.google.dagger:dagger-android-processor:2.27'
// Lifecycle
implementation 'androidx.lifecycle:lifecycle-viewmodel:2.3.0'
}
결국 lifecycle-viewmodel 2.3.0 버전까지 내린 후에야 ViewModelProvider 클래스를 사용할 수 있었다.
+ appcompat 1.5.1 이상 버전을 사용하고 있다면 -> 1.4.1로 변경까지 해야함
🌟 추가적으로, dagger2 또한 최신버전 라이브러리 사용 시 ViewModelProvider를 사용할 수 없었다.
Dagger가 생성한 객체의 scope와 ViewModel의 scope가 달라 객체의 동시성에 문제가 생기는 경우가 있는데,
최신 버전의 Dagger가 그런 문제를 안고 있어서인지..는 모르겠지만 문제가 생겼다.
이것 또한 dagger 2.27 버전을 사용함으로써 해결할 수 있었다.
어림잡아 2시간 정도는 이 이슈에 발목을 잡혀 머리가 100가닥은 빠지는 느낌이 들었다.
그냥 생각없이 developers에서 복붙해서 쓰던 것들에도 관심을 가지고
내가 작업할 프로젝트의 라이브러리 버전을 미리 세팅하고 관리해야함을 깨달았다..ㅎㅎ
요즘 RxJava 공부를 본격적으로 시작해서 블로그 포스팅할 시간이 없었다..
함수형 프로그래밍도 생소한데, 동시에 Dagger까지 배우려니 쓰러질 지경이다.
러닝 커브가 가파르기로 유명한 두 친구이니 마음의 각오는 했지만..
그래도 공부할수록 이걸 체득해서 어떻게 적재적소에 활용할지 설렌다.
분명 굉장한 퍼포먼스를 낼 수 있는 강력한 라이브러리임에 틀림이 없기 때문에..
조만간 RxJava에 대한 포스팅도 시작할 예정이다.
다만, 생소하고 어려운 부분이니만큼 정확한 정보 전달을 위해서
공부 중인 책을 3회독 한 후에, 책 내용을 그대로 옮겨 적는 것이 아닌,
내 이해를 바탕으로 포스팅하려 한다.
화이팅!🔥🔥🔥
'개발 > 트러블슈팅' 카테고리의 다른 글
[안드로이드] is not abstract and does not implement abstract member public abstract fun getActionId() 오류 (0) | 2023.04.17 |
---|---|
[안드로이드] Could not resolve com.android.tools.build:gradle:7.4.2 오류 (0) | 2023.04.13 |
[안드로이드] Circular dependency 오류 (0) | 2023.04.13 |
[안드로이드] by viewModels() 종속성 추가 (0) | 2023.04.12 |
[안드로이드] INSTALL_FAILED_DOWNGRADE_VERSION 해결 방법 (0) | 2022.08.09 |