为什么这个 ReviewApi 在使用 Dagger Hilt 时会出现问题?

Why does this ReviewApi giving problem while working with Dagger Hilt?

看到这个错误:

error: [Dagger/MissingBinding] com.test.consumer.service.api.review.ReviewApi cannot be provided without an @Provides-annotated method.
  public abstract static class SingletonC implements testApplication_GeneratedInjector,
                         ^
      com.test.consumer.service.api.review.ReviewApi is injected at
          com.test.consumer.service.data.review.ReviewRepository(reviewApi)
      com.test.consumer.service.data.review.ReviewRepository is injected at
          com.test.consumer.app.user.reviews.ReviewViewModel(repository)
      com.test.consumer.app.user.reviews.ReviewViewModel is injected at
          com.test.consumer.app.user.reviews.ReviewViewModel_HiltModules.BindsModule.binds(arg0)
      @dagger.hilt.android.internal.lifecycle.HiltViewModelMap java.util.Map<java.lang.String,javax.inject.Provider<androidx.lifecycle.ViewModel>> is requested at
          dagger.hilt.android.internal.lifecycle.HiltViewModelFactory.ViewModelFactoriesEntryPoint.getHiltViewModelMap() [com.test.consumer.service.testApplication_HiltComponents.SingletonC → com.test.consumer.service.testApplication_HiltComponents.ActivityRetainedC → com.test.consumer.service.testApplication_HiltComponents.ViewModelC

]

所以,流程是这样的:

  1. 接口 ReviewApi ->

  2. class ReviewRepository @Inject constructor( 私人 val reviewApi:ReviewApi )

  3. @HiltViewModel class ReviewViewModel @Inject 构造函数(私有 val 存储库:ReviewRepository):BaseViewModel(){

  4. 将在Activity中实现@AndroidEntryPoint,但在此之前只有我无法同步项目,也尝试在Activity中添加,但仍然是同样的问题! !

编辑:

添加了更多代码:

@Provides
    @Singleton
    fun provideRetrofit(client: OkHttpClient): Retrofit =
        Retrofit.Builder().baseUrl(URLConstants.API_BASE)
            .client(client).addConverterFactory(GsonConverterFactory.create()).build()

    @Provides
    @Singleton
    fun provideOkHttpClient(): OkHttpClient {
        val okHttpClientBuilder = OkHttpClient.Builder()
        okHttpClientBuilder.readTimeout(100, TimeUnit.SECONDS);
        okHttpClientBuilder.connectTimeout(100, TimeUnit.SECONDS);
        okHttpClientBuilder.writeTimeout(100, TimeUnit.SECONDS);

        val logger =
            HttpLoggingInterceptor().apply {
                if (BuildConfig.DEBUG) {
                    level = HttpLoggingInterceptor.Level.BODY
                } else {
                    level = HttpLoggingInterceptor.Level.NONE
                }
            }

        okHttpClientBuilder.addInterceptor(logger)
        return okHttpClientBuilder.build()
    }

    @Provides
    @Singleton
    fun provideReviewApi(retrofit: Retrofit): ReviewApi = retrofit.create(ReviewApi::class.java)

    @Provides
    @Singleton
    fun provideReviewRepository(reviewApi: ReviewApi) = ReviewRepository(reviewApi)

如果你需要提供改造接口(任何接口或任何thrid-party库类)你需要使用模块和@Provide Annotation

@Module
@InstallIn(SingleComponent::class)
object AppModule{
@Provides
fun provideBaseUrl() = Constants.BASE_URL

@Singleton
@Provides
fun provideOkHttpClient() = 
    OkHttpClient
        .Builder()
        .build()
}

@Singleton
@Provides
fun provideRetrofit(okHttpClient: OkHttpClient, BASE_URL:String): Retrofit = Retrofit.Builder()
    .addConverterFactory(GsonConverterFactory.create())
    .baseUrl(BASE_URL)
    .client(okHttpClient)
    .build()

@Provides
@Singleton
fun provideApiService(retrofit: Retrofit) = retrofit.create(ReviewApi::class.java)  //Here you have provided the interface and can be injected in anywhere in your Module