如果没有 @Provides 方法,则无法提供 Dagger 2 Named
Dagger 2 Named cannot be provided without a @Provides method
尝试理解 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.
我不明白为什么添加命名限定符在这里对我不起作用。如果我删除这些,我可以毫无问题地获得 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
我想我发现了问题(至少我检查了你的项目并且它正确地生成了 dagger 类)。如果您需要注入带有 @Named
或某些 @Qualifier
注释的字段,您必须使用这种语法:
class MainActivity : AppCompatActivity() {
@Inject lateinit var preferences: SharedPreferences
@Inject @field:[Named ("Uri1")] lateinit var uri1: Uri // for @Named annotation or...
@Inject @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
/ 限定符注释是如何进入 @field:
的(没有 @
本身)。
借鉴于此repo。
尝试理解 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.
我不明白为什么添加命名限定符在这里对我不起作用。如果我删除这些,我可以毫无问题地获得 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
我想我发现了问题(至少我检查了你的项目并且它正确地生成了 dagger 类)。如果您需要注入带有 @Named
或某些 @Qualifier
注释的字段,您必须使用这种语法:
class MainActivity : AppCompatActivity() {
@Inject lateinit var preferences: SharedPreferences
@Inject @field:[Named ("Uri1")] lateinit var uri1: Uri // for @Named annotation or...
@Inject @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
/ 限定符注释是如何进入 @field:
的(没有 @
本身)。
借鉴于此repo。