[ Android Error ] 'BaseActivity' is 'MainActivity', contains a constructor with default parameters. This is currently not supported by the Gradle plugin. Either specify the base class as described at.....
하.. 오늘 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를 이해하고 결론 내용을 수정해야할 것 같습니다.