为什么这个 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
]
所以,流程是这样的:
接口 ReviewApi ->
class ReviewRepository @Inject constructor(
私人 val reviewApi:ReviewApi
)
@HiltViewModel
class ReviewViewModel @Inject 构造函数(私有 val 存储库:ReviewRepository):BaseViewModel(){
将在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
看到这个错误:
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 ->
class ReviewRepository @Inject constructor( 私人 val reviewApi:ReviewApi )
@HiltViewModel class ReviewViewModel @Inject 构造函数(私有 val 存储库:ReviewRepository):BaseViewModel(){
将在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