How to MVP in Dagger Hilt?

Viewed 2441

I can't compile the code using a Model View Presenter(MVP) Hilt approach.

I get this error: /MotionPoC/app/build/generated/source/kapt/debug/com/aria/motionpoc/di/MotionApp_HiltComponents.java:145: error: [Dagger/MissingBinding] com.aria.motionpoc.coupon.MainActivity cannot be provided without an @Inject constructor or an @Provides-annotated method. This type supports members injection but cannot be implicitly provided.

The code itself:

MainActivity.kt

@AndroidEntryPoint
class MainActivity : AppCompatActivity(), MainContract.View {

    @Inject
    lateinit var presenter: MainContract.Presenter

MainPresenter.kt

class MainPresenter @Inject constructor(
    private val view: MainContract.View
): MainContract.Presenter {

    override fun onViewCreated() {
        view.showList()
    }
}

MainModule.kt

@InstallIn(ActivityComponent::class)
@Module
abstract class MainModule {

    @Binds
    abstract fun bindActivity(view: MainActivity): MainContract.View

    @Binds
    abstract fun bindPresenter(impl: MainPresenter): MainContract.Presenter
}

MotionApp.kt

@HiltAndroidApp
open class MotionApp : Application()

Solved! Thank you for the help Manuel Vivo! https://github.com/riodext/AndroidDaggerHiltMVP

1 Answers

The problem is that you're depending on a specific implementation of Activity and that dependency (i.e. MainActivity) is not satisfied in the code.

You'll have to provide that as a binding in the same module:

@InstallIn(ActivityComponent::class)
@Module
object MainActivityModule {

    @Provides
    fun bindActivity(activity: Activity): MainActivity {
        return activity as MainActivity
    }
}
Related