Hilt - Missing binding on CoroutineDispatcher

Viewed 1574

I'm refactoring my app with Hilt as dependency injection manager. I have a constructor injectable class, with two parameters in the constructor. One of the parameters is a CoroutineDispatcher.

class SubscriptionsLocalDataSource @Inject constructor(
    private val subscriptionsDao: SubscriptionsDao,
    private val dispatcher: CoroutineDispatcher = Dispatchers.IO
) : SubscriptionsDataSource {

}

When I try to build the app I get a missing binding error, as below:

error: [Dagger/MissingBinding] kotlinx.coroutines.CoroutineDispatcher cannot be provided without an @Provides-annotated method. public abstract static class ApplicationC implements ApplicationComponent, ^ kotlinx.coroutines.CoroutineDispatcher is injected at com.anagramma.babacodashboard.data.subscriptions.local.SubscriptionsLocalDataSource(…, dispatcher) com.anagramma.babacodashboard.data.subscriptions.local.SubscriptionsLocalDataSource is injected at com.anagramma.babacodashboard.data.subscriptions.SubscriptionsRepositoryImpl(localDataSource, …) com.anagramma.babacodashboard.data.subscriptions.SubscriptionsRepositoryImpl is injected at com.anagramma.babacodashboard.di.SubscriptionsModule.bindSubscriptionsRepository(subscriptionsRepositoryImpl) javax.inject.Provider<com.anagramma.babacodashboard.data.subscriptions.SubscriptionsRepository> is injected at com.anagramma.babacodashboard.ui.orders.subscriptions.SubscriptionsViewModel_AssistedFactory(repository, …) com.anagramma.babacodashboard.ui.orders.subscriptions.SubscriptionsViewModel_AssistedFactory is injected at com.anagramma.babacodashboard.ui.orders.subscriptions.SubscriptionsViewModel_HiltModule.bind(factory) java.util.Map<java.lang.String,javax.inject.Provider<androidx.hilt.lifecycle.ViewModelAssistedFactory<? extends androidx.lifecycle.ViewModel>>> is injected at androidx.hilt.lifecycle.ViewModelFactoryModules.ActivityModule.provideFactory(…, viewModelFactories) @dagger.hilt.android.internal.lifecycle.DefaultActivityViewModelFactory java.util.Set<androidx.lifecycle.ViewModelProvider.Factory> is requested at dagger.hilt.android.internal.lifecycle.DefaultViewModelFactories.ActivityEntryPoint.getActivityViewModelFactory() [com.anagramma.babacodashboard.BabacoDashboardApplication_HiltComponents.ApplicationC → com.anagramma.babacodashboard.BabacoDashboardApplication_HiltComponents.ActivityRetainedC → com.anagramma.babacodashboard.BabacoDashboardApplication_HiltComponents.ActivityC] The following other entry points also depend on it: dagger.hilt.android.internal.lifecycle.DefaultViewModelFactories.FragmentEntryPoint.getFragmentViewModelFactory() [com.anagramma.babacodashboard.BabacoDashboardApplication_HiltComponents.ApplicationC → com.anagramma.babacodashboard.BabacoDashboardApplication_HiltComponents.ActivityRetainedC → com.anagramma.babacodashboard.BabacoDashboardApplication_HiltComponents.ActivityC → com.anagramma.babacodashboard.BabacoDashboardApplication_HiltComponents.FragmentC]

Am I missing some annotation on CoroutineDispatcher?

1 Answers

Don't know if it's the best way but I just solved by creating a DispatcherModule by following this guide

@Module
@InstallIn(ApplicationComponent::class)
object DispatcherModule {
    @IoDispatcher
    @Provides
    fun providesIoDispatcher(): CoroutineDispatcher = Dispatchers.IO
}

@Retention(AnnotationRetention.BINARY)
@Qualifier
annotation class IoDispatcher

Then I refactored my original class to use IoDispatcher annotation:

class SubscriptionsLocalDataSource @Inject constructor(
    private val subscriptionsDao: SubscriptionsDao,
    @IoDispatcher private val dispatcher: CoroutineDispatcher
) : SubscriptionsDataSource {


}
Related