我有一个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无法从子组件中注入所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)