Android

[ 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.....

중곰 2021. 10. 20. 20:32

하.. 오늘 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를 이해하고 결론 내용을 수정해야할 것 같습니다.

반응형