繁体   English   中英

如何在运行时使用 hilt 注入 lambda(或接口)

[英]How to inject lambda(or interface) at runtime with hilt

我正在将刀柄与 MVVM、RecyclerView 一起使用

我想将 lambda 注入适配器以接收来自子视图的 clickListener,但是使用@Module,我无法在运行时创建 lambda。

[以下片段]

// Lambda Listener
class CustomAdapter @Inject constructor(private val listener: (clickedItem: Object) -> Unit) {
    override fun onBindViewHolder(holder: CustomViewHolder, position: Int) {
        holder.itemView.setOnClickListener {
            listener.invoke(clickedItem)
        }
    }
}

有没有办法在运行时注入 lambda 或接口?

不确定这是否是最佳选择,但您可以使用AssistedInjection

首先,您需要创建一个带有AssistedFactory注解的interface

@AssistedFactory
interface Factory {
    fun create(
        listener: (keyName: String) -> Unit
    ): CustomAdapter
}

其次:在您的适配器中将@Inject替换为@AssistedInject ,并在构造函数中使用@Assisted注释添加您的侦听器

class CustomAdapter @AssistedInject constructor(
    @Assisted private val listener: (keyName: String) -> Unit
)

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) =
    CustomViewHolder(CustomViewHolderBinding.inflate(....), listener)

最后,在您的片段/活动中,您需要注入factory而不是适配器,并使用它来创建adapter

@Inject
lateinit var customAdapterFactory: CustomAdapter.Factory

val listener = (keyName: String) -> Unit = { keyName ->
    ......
}
val customAdapter = customAdapterFactory.create(listener)

暂无
暂无

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

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