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
    }