我有一种感觉,这是对Dagger如何运作的简单误解。唉,我无法找到问题。我有几张GotIt卡,我想全身都用。要做到这一点,我使用的模型包括图标,正文,操作文本和动作点击处理程序。各种活动使用不同的适配器来表示状态。现在,我专注于一张卡片,告诉用户他们何时缺少位置权限。我想做的是创建一个提供各种卡片的模块,我拥有的是(使用Kotlin):
@Module
class GotItCardModule {
@Provides @Singleton
@Named(Manifest.permission.ACCESS_FINE_LOCATION)
fun provideLocationGotItCard(application: Application): GotItViewHolder.GotItCard {
val icon = ResourcesCompat.getDrawable(application.resources,
R.drawable.ic_location_off_black_24dp, null)?.apply {
DrawableCompat.setTint(this, Color.WHITE)
}
return GotItViewHolder.GotItCard(
iconDrawable = icon,
bodyText = application.getString(R.string.location_permission_gotit_body),
primaryButtonText = application.getString(R.string.location_permission_gotit_action_primary),
primaryButtonCallback = View.OnClickListener { v ->
(v.context as? Activity)?.let { activity ->
ActivityCompat.requestPermissions(activity,
arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),
RequestCode.Permission.ACCESS_FINE_LOCATION)
}
})
}
}
我已将AppComponent
更新为GotItCardModule::class
,将MainActivity
更新为:
@Inject @Named(Manifest.permission.ACCESS_FINE_LOCATION)
lateinit var locationGotItCard: GotItViewHolder.GotItCard
当我构建时,我收到错误:
Error:(6, 1) error: [dagger.android.AndroidInjector.inject(T)] com.sample.test.adapters.holders.GotItViewHolder.GotItCard cannot be provided without an @Inject constructor or from an @Provides- or @Produces-annotated method.
我不明白的是我有一个@Provides
,而且我把这个模块放在最顶层。为什么不能解决这个问题?
更新:
如果我删除@Named
一切正常(我只能拥有多个GotItCard
)。我也尝试用硬编码的字符串替换字符串。我仍然得到同样的错误。