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