簡體   English   中英

添加自定義 Hilt 組件

[英]Adding a custom Hilt component

美好的一天,我正在嘗試在 hilt 中創建自定義組件,所以我遵循了本教程媒體和本教程以及文檔 但是當我運行應用程序時,我收到這個錯誤,表明它無法創建viewholdermanager kotlin.UninitializedPropertyAccessException: lateinit property viewHolderManager has not been initialized。 所以我相信根據我的理解,我遺漏了一些東西“我們使用 Dagger 為我們生成的提供程序來創建 ViewHolderComponent(自定義組件)的實例”,非常感謝您的幫助。 提前致謝

這是我所做的:-

@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()
    }
}

我認為您必須將class ViewHolderModule更改為object ViewHolderModule否則@Provides不會執行。 請分享您對此結果的經驗,當它不起作用時,我會嘗試深入挖掘。

您應該使用@Inject注釋來構造函數並注入 ViewHolderManager

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM