Android 如果没有 @Provides 注释方法,则无法提供 Hilt。在存储库界面 Class
Android Hilt cannot be provided without an @Provides-annotated method. in repository Interface Class
我收到此错误错误:[Dagger / MissingBinding] com.eduramza.domain.repositories.RemoteRepository 无法在没有@Provides 注释的方法的情况下提供。 在使用 android hilt 实现我的存储库接口时。
那是因为我的用例实现了我的存储库接口。我的实现可能有什么问题,下面是代码:
app.Viewmodel:
@HiltViewModel
class RemoteListViewModel @Inject constructor(
private val useCase: GetTickersUseCase
): ViewModel() {
}
domain.usecase:
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")
}
}
core.module:
@Module
@InstallIn(ActivityComponent::class)
abstract class RemoteModule {
@Binds
abstract fun bindRemoteRepository(
remoteRepositoryImpl: RemoteRepositoryImpl
): RemoteRepository
}
我的多模块应用采用这种结构
其中 core 实现域,app 实现两者。
为什么绑定方法没有被初始化?
您使用了 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
}
我收到此错误错误:[Dagger / MissingBinding] com.eduramza.domain.repositories.RemoteRepository 无法在没有@Provides 注释的方法的情况下提供。 在使用 android hilt 实现我的存储库接口时。
那是因为我的用例实现了我的存储库接口。我的实现可能有什么问题,下面是代码:
app.Viewmodel:
@HiltViewModel
class RemoteListViewModel @Inject constructor(
private val useCase: GetTickersUseCase
): ViewModel() {
}
domain.usecase:
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")
}
}
core.module:
@Module
@InstallIn(ActivityComponent::class)
abstract class RemoteModule {
@Binds
abstract fun bindRemoteRepository(
remoteRepositoryImpl: RemoteRepositoryImpl
): RemoteRepository
}
我的多模块应用采用这种结构
为什么绑定方法没有被初始化?
您使用了 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
}