android – Dagger 2无法从子组件中注入

android – Dagger 2无法从子组件中注入,第1张

概述我知道通常情况下这不应该与使用Kotlin有所不同,但是我遇到了奇怪的情况,其中@Named资格者需要在Kotlin中使用范围. 我有一个ViewHolderFactory类,它允许我创建一个简单的视图类型映射 – >查看持有人类: @Singletonclass ViewHolderFactoryImpl @Inject constructor( private val vie 我知道通常情况下这不应该与使用Kotlin有所不同,但是我遇到了奇怪的情况,其中@named资格者需要在Kotlin中使用范围.

我有一个VIEwHolderFactory类,它允许我创建一个简单的视图类型映射 – >查看持有人类:

@Singletonclass VIEwHolderFactoryImpl @Inject constructor(        private val vIEwHolderComponentProvIDer: ProvIDer<VIEwHolderSubcomponent.Builder>): VIEwHolderFactory(mapOf(        R.layout.vIEw_error to ErrorVIEwHolder::class.java,R.layout.vIEw_soft_error to SoftErrorVIEwHolder::class.java,R.layout.vIEw_empty to EmptyVIEwHolder::class.java,R.layout.vIEw_loading to LoadingVIEwHolder::class.java,R.layout.item_got_it to GotItVIEwHolder::class.java)) {    overrIDe fun createVIEwHolder(parent: VIEwGroup,vIEwType: Int): RecyclerVIEw.VIEwHolder {        val vIEwHolder = super.createVIEwHolder(parent,vIEwType)        if (vIEwHolder is Injectable) {            vIEwHolderComponentProvIDer.get()                    .vIEwHolder(vIEwHolder)                    .build()                    .inject(vIEwHolder)        }        return vIEwHolder    }}

VIEwHolderSubcomponent定义如下,目标是能够为每个视图持有者创建一个子组件注入一些东西:

@VIEwHolderScope@Subcomponent(modules = [VIEwHolderModule::class])interface VIEwHolderSubcomponent {    fun inject(vIEwHolder: RecyclerVIEw.VIEwHolder)    fun vIEwHolder(): RecyclerVIEw.VIEwHolder    @Subcomponent.Builder    interface Builder {        @BindsInstance        fun vIEwHolder(vIEwHolder: RecyclerVIEw.VIEwHolder): Builder        fun build(): VIEwHolderSubcomponent    }}

VIEwHolderModule定义为:

@Moduleclass VIEwHolderModule {    @ProvIDes @VIEwHolderScope    fun provIDeSectionTitleVIEwHolder(vIEwHolder: RecyclerVIEw.VIEwHolder): SectionTitleVIEwHolder =            SectionTitleVIEwHolder(vIEwHolder.itemVIEw)}

当我运行应用程序时,我发现注入不起作用,我的@Inject lateinit var值为null.查看生成的代码,我可以看到原因:

@OverrIDepublic voID inject(RecyclerVIEw.VIEwHolder vIEwHolder) {  MembersInjectors.<RecyclerVIEw.VIEwHolder>noOp().injectMembers(vIEwHolder);}

没有MembersInjectors< RecyclerVIEw.VIEwHolder>为此子组件创建.我无法弄清楚如何使这个工作.我知道我应该能够注入不是由匕首创造的物体,我只是无法弄清楚我在这里缺少什么.

哦,如果它有帮助,我确实在我的AppModule的子组件列表中包含VIEwHolderSubcomponent

解决方法 inject(vIEwHolder:RecyclerVIEw.VIEwHolder)将永远是一个无 *** 作,因为框架类(或在这种情况下大多数库)没有任何@Inject注释字段. Dagger只会为您的inject(MyClass实例)方法中指定的类生成代码,而不会为其任何子类型生成代码.

因此,如果你有一个ErrorVIEwHolder:RecyclerVIEw.VIEwHolder,那么你必须使用一个具有inject(ErrorVIEwHolder实例)方法的组件来生成注入ErrorVIEwHolder的代码.
澄清一下,因为它是生成代码而不是动态反射在运行时调用inject(vIEwHolder:RecyclerVIEw.VIEwHolder)就像使用vIEwHolder一样:ErrorVIEwHolder仍然会尝试为RecyclerVIEw.VIEwHolder注入字段,而不是ErrorVIEwHolder.如上所述,RecyclerVIEw.VIEwHolder将永远是一个无 *** 作.

您必须稍微修改您的设置,以便您可以提供可以注入特定视图的特定子组件,您不能为不同类型使用一个“通用”组件.您可以在RecyclerVIEw.VIEwHolder和ErrorVIEwHolder之间创建一个基类,但是再次,您只能在基类中注入声明的字段(和@Inject annotated),而不是特定的子类.

总结

以上是内存溢出为你收集整理的android – Dagger 2无法从子组件中注入全部内容,希望文章能够帮你解决android – Dagger 2无法从子组件中注入所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1126144.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-30
下一篇 2022-05-30

发表评论

登录后才能评论

评论列表(0条)

保存