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 {
}
我正在使用 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 {
}