如何在运行时使用 hilt 注入 lambda(或接口)
How to inject lambda(or interface) at runtime with hilt
我将刀柄与 MVVM、RecyclerView 结合使用
我想将 lambda 注入适配器以从子视图接收 clickListeners,
但是使用@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)
最后,在您的 fragment/activity 中,您需要注入 factory
而不是您的适配器,并使用它来创建 adapter
@Inject
lateinit var customAdapterFactory: CustomAdapter.Factory
val listener = (keyName: String) -> Unit = { keyName ->
......
}
val customAdapter = customAdapterFactory.create(listener)
我将刀柄与 MVVM、RecyclerView 结合使用
我想将 lambda 注入适配器以从子视图接收 clickListeners, 但是使用@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)
最后,在您的 fragment/activity 中,您需要注入 factory
而不是您的适配器,并使用它来创建 adapter
@Inject
lateinit var customAdapterFactory: CustomAdapter.Factory
val listener = (keyName: String) -> Unit = { keyName ->
......
}
val customAdapter = customAdapterFactory.create(listener)