I have a module to provide a Retrofit interface.
@Module
class NetModule(val base: String) {
@Provides
@Singleton
fun provideOkHttpClient(): OkHttpClient {
return OkHttpClient.Builder()
.addInterceptor(object: Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
val request = chain.request()
info("Request for ${request.url()}")
return chain.proceed(request)
}
}).build()
}
@Provides
@Singleton
fun provideGson(): Gson {
return GsonBuilder()
.enableComplexMapKeySerialization()
.serializeNulls()
.setPrettyPrinting()
.setLenient()
.create()
}
@Provides
@Singleton
fun provideRetrofit(OkHttpClient: OkHttpClient, Gson: Gson): Retrofit {
return Retrofit.Builder()
.baseUrl(base)
.client(OkHttpClient)
.addConverterFactory(GsonConverterFactory.create(Gson))
.addCallAdapterFactory(RxJava2CallAdapterFactory.createAsync())
.build()
}
@Provides
@Singleton
fun provideIdService(Retrofit: Retrofit): IdService {
return Retrofit.create(IdService::class.java)
}
}
The NetModule
is used with NetComponent
@Singleton
@Component(modules = arrayOf(NetModule::class))
interface NetComponent {
fun inject(application: Application)
fun inject(activity: Activity)
}
Which is injected in the application and stored in the applications companion object.
netComponent = DaggerNetComponent.builder().netModule(NetModule("some_url")).build()
netComponent.inject(this)
In the Activity I then have
@Inject lateinit var idService: IdService
This gives a build error
IdService
cannot be provided without an @Provides or @Produces annotated method.
If I attempt to inject the Retrofit
instance instead, I get a different error
cannot access Nullable
The stacktrace shows class file for javax.annotation.Nullable not found.
I haven't been able to find anything referencing this error. There is a StackOverflow post from 12 hours ago which seems to have the same error, but it has been removed. https://stackoverflow.com/questions/44983292/cannot-access-nullable-on-injecting-with-dagger2-in-kotlin