ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Android Hilt 2.31 변경되며 겪은 에러 해결기
    안드로이드 2021. 2. 12. 19:15
    반응형

    gradle 버전에 노란 불이 들어와서 무의식적으로 버전업을 계속 하다가 갑자기 빌드가 안되고, 되던 코드에 빨간 줄이 들어오는 이상한 현상이 생겼다.

    되던 코드가 안될 때 매우 화가 나지만 천천히 이유를 찾아봤다.

    @dagger.hilt.InstallIn(value = {ApplicationComponent.class})
                                    ^
      symbol: class ApplicationComponentNote: [1] Wrote GeneratedAppGlideModule with: []D:\modelmaker\remoteCode\HeathStoneDB\app\build\tmp\kapt3\stubs\debug\com\malibin\hearthstone\db\data\db\HearthStoneDataBase.java:12: warning: Schema export directory is not provided to the annotation processor so we cannot export the schema. You can either provide `room.schemaLocation` annotation processor argument OR set exportSchema to false.
    public abstract class HearthStoneDataBase extends androidx.room.RoomDatabase {
                    ^error: [Hilt]
      @InstallIn, 'value' class is invalid or missing: @dagger.hilt.InstallIn({<error>})
      [Hilt] Processing did not complete. See error above for details.warning: File for type 'com.malibin.hearthstone.db.HearthStoneDBApplication_HiltComponents' created in the last round will not be subject to annotation processing.[WARN] Incremental annotation processing requested, but support is disabled because the following processors are not incremental: androidx.room.RoomProcessor (DYNAMIC).
    

    이상하게 뭐만하면 Room DB 문제인것 마냥 에러가 나온다. 요새는 이런식으로 Room 에러가 터졌다고 나오면 거의 무시해버린다 (경각심을 가지자;;)

    하여튼 중요한건 Room 때문에 생긴 문제가 아니라는 것이다.

    이전에 작성해놨던 Hilt 코드가 빨간줄이 들어온다. 단순히 빌드 문제인 줄 알고 Clean&rebulid도 엄청 많이 해보고, 캐시 지우고 껐다 키기도 했지만, 문제가 해결되지는 않았다.

     

    뭐가문제지....??

    그러고보니 Gradle 버전업을 막 했던게 생각이 나서 지금 버전인 Hilt 2.31 버전에 무슨일이 생겼는지 검색해보니....

    생각보다 대규모로 변경점들이 생겼다.

    특히 저 ApplicationComponent 애너테이션은 없어졌다!

    그러니까 빨간줄로 나오지...

     

    @ApplicationComponent의 삭제

    hilt 2.31버전부터 @ApplicationComponent가 사라졌다.

    이제부터는 @SingletonComponent로 교체해야한다.

     

    순수하게 이름 변경과 functional no-op을 의도한다는데.. 뭔소린지 모르겠다. 영어를 못하는게 정말 안타까운 순간이다.

    In Hilt 2.31, the previous ApplicationComponent has been removed. We should migrate to SingletonComponent instead. This is intended to be a pure rename/functional no-op.

    아무래도 application Component 보다는 Singleton Component가 훨씬 더 직관성 있는 이름이라 생각된다.

     

    어쨌든, 이것만 고쳐도 충분히 에러 해결을 할 수 있었다.

     

    ViewModel Injection 변경

    이번 버전부터 ViewModel을 주입 받는 방법이 변경되었다.

    변경되었다기 보다는, androidx.hilt:hilt-lifecycle-viewmodel 라이브러리에 있는 @ViewModelInject 를 사용하지 않고 주입할 수 있게 되었다. 

     

    이제는 아래 코드처럼 ViewModel을 주입 받을 수 있다.

    @HiltViewModel
    class CardsViewModel @Inject constructor(
        private val cardsRepository: CardsRepository,
        private val blizzardAuthRepository: BlizzardAuthRepository,
    ) : ViewModel() {
    	...
    }

    또, @Assisted 없이도 SavedStateHandle 객체를 주입 받을 수 있게 변경되었다.

     

    *참고* 패키지의 위치

    • @ViewModelInject - androidx.hilt.lifecycle.ViewModelInject
    • @HiltViewModel - dagger.hilt.android.lifecycle.HiltViewModel

     

     

    기타 다른 것들도 추가 된게 있다. ViewModelScope 라던지 HiltWorker라던지.

    열심히 영어를 해석해서 공부해봐야겠다. 영어를 못하는건 정말 슬프다 😥

     

     


     

     

    참고자료

    proandroiddev.com/whats-new-in-hilt-and-dagger-2-31-c46b7abbc64a

    반응형

    댓글

Designed by Tistory.