Dagger 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 

Project Repo @ Github

我想我发现了这个问题(至少我检查了你的项目,并正确地生成了匕首类)。 如果您需要注入使用@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:不带@本身)。

从这个回购借来的想法。