Hilt - CoroutineDispatcher 上缺少绑定

Nic*_*zzi 3 android dependency-injection kotlin dagger-hilt

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

\n
class SubscriptionsLocalDataSource @Inject constructor(\n    private val subscriptionsDao: SubscriptionsDao,\n    private val dispatcher: CoroutineDispatcher = Dispatchers.IO\n) : SubscriptionsDataSource {\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
\n

错误:[Dagger/MissingBinding] kotlinx.coroutines.CoroutineDispatcher 如果没有 @Provides 注释的方法,则无法提供。\n公共抽象静态类 ApplicationC 实现 ApplicationComponent,\n^\nkotlinx.coroutines.CoroutineDispatcher 被注入到\ncom.anagramma.babacodashboard .data.subscriptions.local.SubscriptionsLocalDataSource(\xe2\x80\xa6, 调度程序)\ncom.anagramma.babacodashboard.data.subscriptions.local.SubscriptionsLocalDataSource 被注入\ncom.anagramma.babacodashboard.data.subscriptions.SubscriptionsRepositoryImpl(localDataSource, \xe2\x80\xa6)\ncom.anagramma.babacodashboard.data.subscriptions.SubscriptionsRepositoryImpl 被注入\ncom.anagramma.babacodashboard.di.SubscriptionsModule.bindSubscriptionsRepository(subscriptionsRepositoryImpl)\njavax.inject.Provider<com.anagramma.babacodashboard。 data.subscriptions.SubscriptionsRepository> 注入于\ncom.anagramma.babacodashboard.ui.orders.subscriptions.SubscriptionsViewModel_AssistedFactory(repository, \xe2\x80\xa6)\ncom.anagramma.babacodashboard.ui.orders.subscriptions.SubscriptionsViewModel_AssistedFactory 注入于\ncom.anagramma.babacodashboard.ui.orders.subscriptions.SubscriptionsViewModel_HiltModule.bind(factory)\njava.util.Map<java.lang.String,javax.inject.Provider<androidx.hilt.lifecycle.ViewModelAssistedFactory<? extends androidx.lifecycle.ViewModel>>> 注入于\nandroidx.hilt.lifecycle.ViewModelFactoryModules.ActivityModule.provideFactory(\xe2\x80\xa6, viewModelFactories)\n@dagger.hilt.android.internal.lifecycle.DefaultActivityViewModelFactory java. util.Set<androidx.lifecycle.ViewModelProvider.Factory> 请求于\ndagger.hilt.android.internal.lifecycle.DefaultViewModelFactories.ActivityEntryPoint.getActivityViewModelFactory() [com.anagramma.babacodashboard.BabacoDashboardApplication_HiltComponents.ApplicationC \xe2\x86\x92 com .anagramma.babacodashboard.BabacoDashboardApplication_HiltComponents.ActivityRetainedC \xe2\x86\x92 com.anagramma.babacodashboard.BabacoDashboardApplication_HiltComponents.ActivityC]\n以下其他入口点也依赖于它:\ndagger.hilt.android.internal.lifecycle.DefaultViewModelFactories.FragmentEntryPoint。 getFragmentViewModelFactory() [com.anagramma.babacodashboard.BabacoDashboardApplication_HiltComponents.ApplicationC \xe2\x86\x92 com.anagramma.babacodashboard.BabacoDashboardApplication_HiltComponents.ActivityRetainedC \xe2\x86\x92 com.anagramma.babacodashboard.BabacoDashboardApplication_HiltComponents.ActivityC \xe2\x86\x92 com .anagramma.babacodashboard.BabacoDashboardApplication_HiltComponents.FragmentC]

\n
\n

我是否缺少 CoroutineDispatcher 上的一些注释?

\n

Nic*_*zzi 10

不知道这是否是最好的方法,但我只是DispatcherModule按照本指南创建了一个解决方案

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

@Retention(AnnotationRetention.BINARY)
@Qualifier
annotation class IoDispatcher
Run Code Online (Sandbox Code Playgroud)

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

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


}
Run Code Online (Sandbox Code Playgroud)