하.. 오늘 Hilt를 프로젝트에 적용하는데.. 엄청 삽질을 했습니다.
진짜 오랫만에 엄청 삽질했네요...
나중에 삽질 하지 않도록 기록 해두기 위해 글을 작성합니다.
🖍 에러 발생 원인부터 말씀드리자면, BaseActivity 선언 형태를 잘못해서 발생된 문제였습니다.
일단 Hilt 적용 부터해서 차근차근 삽질의 기록을 해두겠습니다.
먼저 Hilt 를 Gradle 적용합니다.
📝. TMI. 에러가 떠서.. 엄청 Hilt 버전을 낮추고, 높이고... 해봤습니다. 그러나... 결과는 버전 문제가 일단 아니였습니다.
1. Hilt Moudle Gradle Add
apply plugin: 'dagger.hilt.android.plugin'
apply plugin: 'kotlin-kapt'
...
// Hilt
dependencies {
implementation "com.google.dagger:hilt-android:2.39.1"
kapt "com.google.dagger:hilt-android-compiler:2.39.1"
}
implementation 'androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha01'
implementation 'androidx.lifecycle:lifecycle-viewmodel-savedstate:2.2.0'
// When using Kotlin.
kapt 'androidx.hilt:hilt-compiler:1.0.0-alpha01'
2. Hilt Project Gradle Add
dependencies {
classpath 'com.google.dagger:hilt-android-gradle-plugin:2.38'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.10"
...
}
3. gradle.properties kpt 관련 내용 추가
kapt.use.worker.api=false
kapt.incremental.apt=false
kapt.verbose=true
이렇게 3가지 작업을 하고 이제 Hilt 가이드를 보고 따라 하나씩 하나씩 작업했습니다.
1. AppContext
@HiltAndroidApp
class AppContext : Application() {
init {
instance = this
}
companion object {
private var instance: AppContext? = null
fun applicationContext(): Context? {
return instance?.applicationContext
}
}
}
2. MainActivity
@AndroidEntryPoint
class MainActivity : BaseActivity(R.layout.activity_main){
private val mainViewModel : MainViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
initBinding()
}
private fun initBinding() {
with(binding) {
lifecycleOwner = this@MainActivity
vm = mainViewModel
}
}
}
⁉︎ MainActivity에서 아시는 분들은 원인에 대해 눈치 채셨을지 모르지만.. 일단 진행하겠습니다.
3. BaseActivity <- 여기서가 문제
abstract class BaseActivity(@LayoutRes private val contentLayoutId: Int) : AppCompatActivity(){
val disposable: CompositeDisposable by lazy {
CompositeDisposable()
}
protected lateinit var binding: T
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this, contentLayoutId)
}
override fun onDestroy() {
super.onDestroy()
disposable.clear()
}
}
이렇게 진행되다 보니... 위의 에러가 계속 발생되었습니다. BaseActivity를 어떻게 사용 해야되는지도 .. 그저.. 가져와 쓰는.. 에휴.. 반성합니다...
결론‼️
Hilt를 통해 사용할때는
BaseActivity (@LayoutRes private val contentLayoutId: Int) 로 하게 되면 위의 에러가 발생되고,
BaseActivity<T : ViewDataBinding>(@LayoutRes private val contentLayoutId: Int) 이 형식의 BaseActivity만 Hilt에서 지원해주기 때문에 위의 에러가 발생됩니다.
문제의 원인을 더 집중해서 찾고, 왜? Hilt에서는 이 형태의 BaseActivity만 지원되는지도 궁금해서 추가로 나중에 알게되면 내용을 추가하겠습니다.
---------------------------------------------------------------------------------------------------------------------
2021.11.20 수정 내용
- 위의 결론 내용이 뭔가 의심된다.. Hilt 에서 BaseActivity 형식이 있다는 것보다 제가 Hilt를 제대로 이해하지 않고 쓰다보니 일어난 이유 같다. 조금 더 Hilt를 이해하고 결론 내용을 수정해야할 것 같습니다.
'Android' 카테고리의 다른 글
| [ Android ] Application Context vs Activity Context (1) | 2022.01.14 |
|---|---|
| [ Android ] TextView FlowLayout 을 Material Design Chip을 활용하여 만들기 (3) | 2021.12.30 |
| [ Android ] Google Login Error = 12500 (2) | 2021.10.11 |
| [ Android ] androidx.appcompat.widget.appcompatbutton vs Button (6) | 2021.10.08 |
| [ Android Issue ] java.lang.NoClassDefFoundError: Failed resolution of: Ljava/time/LocalDate; (1) | 2021.09.30 |