Dagger 2将命名对象注入活动

时间:2017-12-08 19:10:55

标签: android dagger-2

我有一种感觉,这是对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)。我也尝试用硬编码的字符串替换字符串。我仍然得到同样的错误。

0 个答案:

没有答案