如何在运行时使用 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)