Hilt - 缺少对 CoroutineDispatcher 的绑定

Hilt - Missing binding on CoroutineDispatcher

我正在使用 Hilt 作为依赖项注入管理器重构我的应用程序。 我有一个可注入的构造函数 class,构造函数中有两个参数。其中一个参数是 CoroutineDispatcher.

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

}

当我尝试构建应用程序时,出现缺少绑定错误,如下所示:

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]

我是否遗漏了 CoroutineDispatcher 上的一些注释?

不知道这是否是最好的方法,但我只是按照 this guide

创建了一个 DispatcherModule 来解决了
@Module
@InstallIn(ApplicationComponent::class)
object DispatcherModule {
    @IoDispatcher
    @Provides
    fun providesIoDispatcher(): CoroutineDispatcher = Dispatchers.IO
}

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

然后我重构了我原来的 class 以使用 IoDispatcher 注释:

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


}