I was trying to create base activity using this answer with Hilt. But this throws an error.
error: [Hilt]
public abstract class ActivityBase<V extends androidx.lifecycle.ViewModel, B extends androidx.viewbinding.ViewBinding> extends androidx.appcompat.app.AppCompatActivity {
^
Found unimplemented abstract methods, [getViewBinding()], in an abstract module, com.baseproject.base.ActivityBase. Did you forget to add a Dagger binding annotation (e.g. @Binds)?
Base Activity:
@InstallIn(SingletonComponent::class)
@Module
abstract class ActivityBase<V : ViewModel, B: ViewBinding> : AppCompatActivity() {
var mViewModel: V? = null
protected var mBinding: B? = null
private fun getViewModelClass(): Class<V> {
val type = (javaClass.genericSuperclass as ParameterizedType).actualTypeArguments[0]
return type as Class<V>
}
abstract fun getViewBinding(): B
lateinit var navHostFragment: NavHostFragment
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
init()
setContentView(mBinding?.root)
setUpHideKeyBoard()
}
protected open fun init() {
mBinding = getViewBinding()
mViewModel = ViewModelProvider(this).get(getViewModelClass())
}
}
Main Activity:
@AndroidEntryPoint
class MainActivity : ActivityBase<ViewModelBase, ActivityMainBinding>() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
override fun getViewBinding() = ActivityMainBinding.inflate(layoutInflater)
}
if I remove both @Module and @InstallIn(SingletonComponent::class) annotations then it throws below error.
error: method getActivityFactory in class DefaultViewModelFactories cannot be applied to given types;
return DefaultViewModelFactories.getActivityFactory(this);
^
required: ComponentActivity,Factory
found: Hilt_MainActivity<viewBinding>
reason: actual and formal argument lists differ in length
where B is a type-variable:
B extends ViewBinding declared in class Hilt_MainActivity