首页 > 解决方案 > 如果没有 @Provides-annotated 方法,就无法提供 Android Hilt。在存储库接口类中

问题描述

我收到此错误错误:[Dagger / MissingBinding] com.eduramza.domain.repositories.RemoteRepository 不能在没有 @Provides-annotated 方法的情况下提供。使用 android hilt 实现我的存储库接口时。

那是因为我的 useCase 实现了我的存储库接口。我的实现可能有什么问题,下面是代码:

应用程序视图模型:

@HiltViewModel
class RemoteListViewModel @Inject constructor(
    private val useCase: GetTickersUseCase
    ): ViewModel() {
}

域.用例:

class GetTickersUseCase @Inject constructor(
    private val remoteRepository: RemoteRepository)
    : SingleUseCase<MainCoins> {

    override suspend fun executeCall(): Flow<Result<MainCoins>> = remoteRepository.readAllTickers()

}

domain.repository:

interface RemoteRepository {
    suspend fun readAllTickers(): Flow<Result<MainCoins>>
}

core.repositoryImpl:

class RemoteRepositoryImpl @Inject constructor(
    private val apiService: BraziliexService,
    private val tickersMapper: TickersMapper
) : RemoteRepository{

    override suspend fun readAllTickers(): Flow<Result<MainCoins>> {
        TODO("Not yet implemented")
    }
}

核心模块:

@Module
@InstallIn(ActivityComponent::class)
abstract class RemoteModule {

@Binds
abstract fun bindRemoteRepository(
    remoteRepositoryImpl: RemoteRepositoryImpl
    ): RemoteRepository
}

我的多模块应用程序在这个结构 在此处输入图像描述 中核心实现域,应用程序实现两者。

为什么绑定方法没有被初始化?

在此处输入图像描述

标签: androiddependency-injectioninterfacerepositorydagger-hilt

解决方案


您使用的是 ActivityComponent 但 RemoteRepository 是 ViewModel 的间接依赖项,因此它应该与 ViewModel 生命周期相关联

所以代替ActivityComponent

@Module
@InstallIn(ActivityComponent::class)
abstract class RemoteModule {

@Binds
abstract fun bindRemoteRepository(
    remoteRepositoryImpl: RemoteRepositoryImpl
    ): RemoteRepository
}

使用这个ViewModelComponent

@Module
    @InstallIn(ViewModelComponent::class)
    abstract class RemoteModule {
    
    @Binds
    abstract fun bindRemoteRepository(
        remoteRepositoryImpl: RemoteRepositoryImpl
        ): RemoteRepository
    }

推荐阅读