У меня есть модуль для обеспечения интерфейса для модернизации.
@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) }
Который вводится в приложение и сохраняется в объекте компаньона приложений.
netComponent = DaggerNetComponent.builder().netModule(NetModule("some_url")).build() netComponent.inject(this)
В Деятельности я тогда
@Inject lateinit var idService: IdService
Это дает ошибку сборки
IdService
не может быть предоставлен без @Provides или @Produces аннотированного метода.
Если я попытаюсь Retrofit
экземпляр Retrofit
вместо этого, я получаю другую ошибку
недоступен Nullable
В стеке отображается файл класса для javax.nnotation.Nullable не найден.
Я не смог найти ничего, ссылаясь на эту ошибку. Есть сообщение StackOverflow от 12 часов назад, которое, похоже, имеет ту же ошибку, но оно было удалено. https://stackoverflow.com/questions/44983292/cannot-access-nullable-on-injecting-with-dagger2-in-kotlin
Я получал javax.annotation.Nullable не найденную ошибку, которую я смог исправить, добавив в библиотеку findbugs, которая содержит аннотацию Nullable.
Если вы используете gradle, добавьте следующую зависимость:
compile group: 'com.google.code.findbugs', name: 'jsr305', version: '3.0.2'
IdService не может быть предоставлен без @Provides или @Produces аннотированного метода.
Это связано с тем, что вы не IdService
свою зависимость, где присутствует IdService
. Так кинжал не знает, как обеспечить IdService
.
NetModule используется с NetComponent, который вводится в приложение и сохраняется в объекте компаньона приложений.
Вы должны вводить зависимости, в которых вы хотите его использовать (здесь ваша Activity
)
Поэтому напишите инъекцию в OnCreate
вашей деятельности
netComponent = DaggerNetComponent.builder() .netModule(NetModule("some_url")) .build() .inject(this)