Dagger 2 Named не может быть предоставлен без метода @Provides
Попытка взломать Dagger 2 и проблема с именованными провайдерами. У меня есть простая настройка следующим образом:
// Module
@Module
class AppModule(private val app: App) {
@Provides @AppScope fun providesApp() = app
@Provides @AppScope fun provideSharedPreferences(app: App) = PreferenceManager.getDefaultSharedPreferences(app)
@Provides @AppScope @Named("Uri1") fun providesUri1() = Uri.Builder().scheme("https").authority("authory1").build()
@Provides @AppScope @Named("Uri2") fun providesUri2() = Uri.Builder().scheme("https").authority("authory2").build()
}
// Component
@AppScope
@Component(modules = arrayOf(AppModule::class))
interface AppComponent {
fun inject(target: MainActivity)
}
// MainActivity
@Inject @AppScope lateinit var preferences: SharedPreferences
@Inject @AppScope @Named("Uri1") lateinit var uri1: Uri
@Inject @AppScope @Named("Uri2") lateinit var uri2: Uri
При перестройке моего проекта мне дают:
Error:Gradle: android.net.Uri cannot be provided without an @Provides- or @Produces-annotated method.
Я не понимаю, почему добавление квалификатора Named здесь не работает. Если я удаляю их, я могу получить экземпляр SharedPreferences без проблем.
Любое понимание того, что я делаю неправильно, будет оценено!
РЕДАКТИРОВАТЬ:Изменения в предложениях с теми же результатами, что и выше.
// New module
@Module
class AppModule(private val app: App) {
@Provides @AppScope fun providesApp() = app
@Provides @AppScope fun provideSharedPreferences(app: App) = PreferenceManager.getDefaultSharedPreferences(app)
@Provides @AppScope @Tag("Uri1") fun providesUri1(): Uri = Uri.Builder().scheme("https").authority("authority1").build()
@Provides @AppScope @Tag("Uri2") fun providesUri2(): Uri = Uri.Builder().scheme("https").authority("authority2").build()
}
// Tag annotation
@Qualifier
@Retention(AnnotationRetention.RUNTIME)
annotation class Tag(val tag: String = "")
// MainActivity
@Inject @AppScope lateinit var preferences: SharedPreferences
@Inject @AppScope @Tag("Uri1") lateinit var uri1: Uri
@Inject @AppScope @Tag("Uri2") lateinit var uri2: Uri