Кинжал 2 Именован не может быть предоставлен без метода @Provides

Попытка зацепить кинжал 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 

Проект Репо @ Гитуб

Я думаю, что нашел проблему (по крайней мере, я проверил ваш проект и создал классы кинжалов правильно). Если вам нужно ввести поля, аннотированные с помощью @Named или некоторой аннотации @Qualifier вы должны использовать такой синтаксис:

 class MainActivity : AppCompatActivity() { @Inject @AppScope lateinit var preferences: SharedPreferences @Inject @AppScope @field:[Named ("Uri1")] lateinit var uri1: Uri // for @Named annotation or... @Inject @AppScope @field:[Uri2] lateinit var uri2: Uri // ...for @Qualifier annotation override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) app().component.inject(this) println(uri1) println(uri2) } } 

Обратите внимание, что аннотация @Named / qualifier находится внутри @field: (без самого @ ).

Идея заимствована из этого репо .