Search code examples
androiddagger-2dagger-hilt

Provide Activity instance with Hilt


How can I translate something like this:

@Module
abstract class BaseActivityModule<A : AppCompatActivity> {
    @Binds
    abstract fun provideActivity(activity: A): AppCompatActivity

    companion object {
        @Provides
        @ActivityContext
        fun provideContext(activity: AppCompatActivity): Context = activity
    }
}

@Module
abstract class SomeActivityModule : BaseActivityModule<SomeActivity>()

So it can be used latter like:

@ActivityScope
class UtilsClass @Inject constructor(
    private val activity: AppCompatActivity,
    ...
){...}

I've migrated a playground project from dagger to hilt and it went super smooth, but I've stumbled across this use-case. I've changed the code so I wont be needing that instance any more but the curiosity remains.

Is it even possible now that we don't need this kind of setup:

@ActivityScope
@ContributesAndroidInjector(modules = [SomeActivityModule::class])
abstract fun someActivity(): SomeActivity

Solution

  • i didn't try this code yet, if its not working please CMiMW,
    according to documentation here, you can use predefined qualifers for Application Context and activity context.

    your code may look like this

    @ActivityScoped
    class UtilsClass @Inject constructor(
    @ActivityContext private val activity: Context,
    ... 
    ){
     ...
     val myActivity = if(context is MyActivity) context as MyActivity else throw ......  // check if its provided context was desired activity
     ...
    
    }