[英]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.