简体   繁体   English

添加自定义 Hilt 组件

[英]Adding a custom Hilt component

good day, i'm trying to create custom component in hilt so i followed this tutorial medium and this tutorial as well documentation .美好的一天,我正在尝试在 hilt 中创建自定义组件,所以我遵循了本教程媒体和本教程以及文档 but when i run the application i get this error indicating that it failed to create the viewholdermanager kotlin.UninitializedPropertyAccessException: lateinit property viewHolderManager has not been initialized.但是当我运行应用程序时,我收到这个错误,表明它无法创建viewholdermanager kotlin.UninitializedPropertyAccessException: lateinit property viewHolderManager has not been initialized。 so i believe that i'm missing something as per my understanding "We use the provider Dagger generates for us to create instances of ViewHolderComponent( custom component)" really appreciate your help.所以我相信根据我的理解,我遗漏了一些东西“我们使用 Dagger 为我们生成的提供程序来创建 ViewHolderComponent(自定义组件)的实例”,非常感谢您的帮助。 thanks in advance提前致谢

here is what i done :-这是我所做的:-

@Scope
@MustBeDocumented
@Retention(value = AnnotationRetention.RUNTIME)
annotation class ViewHolderScope

@ViewHolderScope
@DefineComponent(parent = ApplicationComponent::class)
interface ViewHolderComponent{

    @DefineComponent.Builder
    interface Builder {
        fun build(): ViewHolderComponent
        fun viewHolder(@BindsInstance viewHolder: RecyclerView.ViewHolder?): ViewHolderComponent.Builder?
    }
}

@Singleton
class ViewHolderManager @Inject constructor(
    private val viewHolderComponentProvider: Provider<ViewHolderComponent.Builder>
) {

    var viewHolderComponent: ViewHolderComponent? = null
        private set


    fun setViewHolder(viewHolder: RecyclerView.ViewHolder) {
        viewHolderComponent = viewHolderComponentProvider.get().viewHolder(viewHolder)?.build()
    }

}


@Module
@InstallIn(ViewHolderComponent::class)
class ViewHolderModule{

    @Provides
    @ViewHolderScope
    fun provideLifecycleRegistry(viewHolder: RecyclerView.ViewHolder): LifecycleRegistry = LifecycleRegistry(viewHolder)



    @Provides
    @ViewHolderScope
    fun provideArrayAdapter(viewHolder: RecyclerView.ViewHolder): ArrayAdapter<DataItem> = ArrayAdapter((viewHolder as BaseItemViewHolder<*, *>).parent.context, R.layout.item_dropdown_menu_popup,
        ArrayList())

}

class SavedCarItemViewHolder():  RecyclerView.ViewHolder(...){

    @EntryPoint
    @InstallIn(ViewHolderComponent::class)
    interface ViewHolderEntryPoint {
        fun getLifecycleRegistry(): LifecycleRegistry
        fun getDataItemArrayAdapter(): ArrayAdapter<DataItem>
    }



    protected fun onCreate() {
        injectDependencies()
    }

    lateinit var lifecycleRegistry: LifecycleRegistry
    @Inject lateinit var viewHolderManager:ViewHolderManager
    fun injectDependencies() {
        val hiltEntryPoint = EntryPoints.get(viewHolderManager.viewHolderComponent, ViewHolderEntryPoint::class.java)
        lifecycleRegistry = hiltEntryPoint.getLifecycleRegistry()
    }
}

I think you have to change your class ViewHolderModule to object ViewHolderModule otherwise @Provides is not executed.我认为您必须将class ViewHolderModule更改为object ViewHolderModule否则@Provides不会执行。 Please share your experience with this result and when it does not work, I will try to dig deeper in.请分享您对此结果的经验,当它不起作用时,我会尝试深入挖掘。

您应该使用@Inject注释来构造函数并注入 ViewHolderManager

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM