当前位置: 首页 > 知识库问答 >
问题:

为什么这个评论在使用匕首柄时会出现问题?

乜思淼
2023-03-14

看到这个错误:

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

]

所以,流程是这样的:

>

  • 界面ReviewApi-

    类 ReviewRepository @Inject constructor( private val reviewApi: ReviewApi )

    @HiltViewModel类 ReviewViewModel @Inject constructor(private val repository: ReviewRepository) : BaseViewModel() {

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

    编辑:

    添加了更多代码:

    @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)
    
  • 共有1个答案

    夹谷苗宣
    2023-03-14

    如果您需要提供改进的接口(任何接口或任何第三方库类),您需要使用模块和@Provide注释

    @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
    
     类似资料: