我有一个提供Retrofit界面的模块。
simplejson
JSONDecodeError
与@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)
}
}
NetModule
在应用程序中注入并存储在应用程序配套对象中。
NetComponent
在活动中我有
@Singleton
@Component(modules = arrayOf(NetModule::class))
interface NetComponent {
fun inject(application: Application)
fun inject(activity: Activity)
}
这会产生构建错误
如果没有@Provides或@Produces注释方法,则无法提供
netComponent = DaggerNetComponent.builder().netModule(NetModule("some_url")).build() netComponent.inject(this)
。
如果我尝试注入@Inject lateinit var idService: IdService
实例,我会收到不同的错误
无法访问Nullable
stacktrace显示找不到javax.annotation.Nullable的类文件。
我无法找到任何引用此错误的内容。 从12小时前有一个StackOverflow帖子似乎有相同的错误,但它已被删除。 https://stackoverflow.com/questions/44983292/cannot-access-nullable-on-injecting-with-dagger2-in-kotlin
答案 0 :(得分:8)
我收到了javax.annotation.Nullable not found错误,我可以通过添加包含Nullable注释的findbugs库来解决这个错误。
如果您使用的是gradle,请添加以下依赖项:
implementation 'com.google.code.findbugs:jsr305:3.0.2'
答案 1 :(得分:0)
如果没有@Provides或@Produces,则无法提供IdService 注释方法。
这是因为您没有在IdService
存在的情况下注入您的依赖项。所以匕首不知道如何提供IdService
。
NetModule用于注入的NetComponent 应用程序并存储在应用程序伴随对象中。
您必须将依赖项注入您希望使用的位置(此处为Activity
)
所以在你的活动的OnCreate
netComponent = DaggerNetComponent.builder()
.netModule(NetModule("some_url"))
.build()
.inject(this)