[해결]error.NonExistentClass: Hilt 로 ViewModel 에 Proto DataStore 인스턴스 전달할 때

Proto DataStore 에 Hilt 를 적용할 때 컴파일 오류가 발생하여 해결한 방법을 공유한다.

Hilt + Proto DataStore + ViewModel 에서 문제 발생

지난 글에서 build.gradle.kts 를 공개한 이후 Proto DataStore 를 익혔다(지난 글: https://hhtt.kr/103026). 그런데 코드에 ViewModel Factory 를 이용해서 DataStore 인스턴스를 ViewModel 에 넣어주도록 되어 있어서 Hilt 로 주입하도록 바꾸려고 했다. 이 때, Preferences DataStore 인스턴스는 문제없이 주입되었지만 Proto DataStore 인스턴스 주입을 시도하자 오류가 발생했다.

(androidx.datastore.core.DataStore<error.NonExistentClass>)'
because 'error.NonExistentClass' could not be resolved.

문제 해결

이 문제를 해결하기 위해서 어제 낮부터 밤까지 분투했다. Hilt 버전을 올렸다, 내렸다, 다른 것도 바꿔보고, 코드에 문제가 있나 검사하고…

이리저리 검색을 하다가 어느 글에서 Kotlin 버전과 Hilt 버전을 운운하기에 Kotlin 버전과 관련한 해결책을 모색하다가 Kotlin 1.9.10 으로 해결됨을 확인했다. 나는 지난 며칠간 Kotlin Kotlin 1.9.22 를 사용하고 있었다. 내려가기 아쉬웠지만 어쩔 수 없었다.

id("org.jetbrains.kotlin.android") version "1.9.10" apply false

(참고한 글: https://stackoverflow.com/questions/77342860/how-to-resolve-the-gradle-build-error-java-lang-nosuchmethoderror )

KSP 와 Compose 도 변경

지난 글에도 썼지만 Kotlin 이 바뀌면 KSP 와 Compose 도 바뀌어야 한다:

id("com.google.devtools.ksp") version "1.9.10-1.0.13" apply false
composeOptions {
        //kotlinCompilerExtensionVersion = "1.5.8" //for Kotlin 1.9.22
        kotlinCompilerExtensionVersion = "1.5.3" //for Kotlin 1.9.10
        //kotlinCompilerExtensionVersion = "1.4.8" //for Kotlin 1.8.22
    }

Hilt 와 Room 은 최신 버전 사용이 가능하다.

id("com.google.dagger.hilt.android") version "2.50" apply false
val roomVersion = "2.6.1"
implementation("androidx.room:room-runtime:$roomVersion") //등등

나머지 설정은 지난 글의 첨부 파일을 참고하면 큰 문제 없을 것이다.

현 시점에서 아마도 Kotlin 최신 버전과 HIlt 최신 버전이 상충하는 듯하다. 곧 해결되리라 기대한다.

JDK 버전도 변경

이 문제와는 상관없는 듯하지만 다른 조언에 따라 build.gradle.kts 에 설정된 Java 버전에 맞춰서 JDK 버전도 18 로 바꾸었다.

Settings > Build, Execution, Deployment > Build > Gradle > Gradle JDK > corrletto-18

이 설정으로 아마 다음 오류를 해결했던 것 같다. 이런 저런 오류를 하도 많이 경험해서 기억이 가물가물하다:

Execution failed for task ':app:kspDebugKotlin'.
> 'compileDebugJavaWithJavac' task (current target is 1.8) and 'kspDebugKotlin' task (current target is 17) jvm target compatibility should be set to the same Java version.

Leave a Comment