首页 > 解决方案 > 如何使用 Dagger @Inject 到 Kotlin Builder 类中

问题描述

我当前的 Android 项目使用了许多 Kotlin 数据类,这些数据类使用构建器来构建它们。

我希望将一个实例注入 Kotlin 数据类。

我的每个数据类都有这个基本结构

data class MyDataKlass(    val onError: Consumer<in Throwable>,
                           val onComplete: Action,
                           val dbController: DatabaseController,
                           val lnController: ILoginNetworkController) : BaseSO() {

    @SuppressLint("CheckResult")
    fun execute() {

    }

}

fun myFunction(block: MyDataKlassBuilder.() -> Unit): MyDataKlass = MyDataKlassBuilder().apply(block).build()

class MyDataKlassBuilder {

    var onError: Consumer<in Throwable> = Consumer { }
    var onComplete: Action = Action { }
    lateinit var dbController: DatabaseController
    lateinit var lnController: ILoginNetworkController

    fun build(): MyDataKlass = MyDataKlass(onError, onComplete, dbController, lnController)
}

我使用这些课程如下:-

 val myFunction = myFunction {
                onComplete = Action { syncWorkerResult = Result.success() }
                dbController = databaseController
                lnController = loginNetwork
                onError = Consumer {
                    syncWorkerResult = Result.failure()
                }
            }

 myFunction.execute()

目前我正在将我的数据库(DatabaseController)和网络(ILoginNetworkController)控制器传递给 Kotlin 数据类的构建器

我希望@Inject 他们让我的代码“更干净”

我可以@Inject 到我的活动和存储库中,但看不到如何使用 Dagger 将它们注入到上述数据类中。

是否可以 @Inject 到 Kotlin 数据类中?

标签: androidkotlindagger-2

解决方案


我从未在数据类上尝试过这种语法,但它可能是个好方法:

data class MyDataKlass @Inject constructor(
    val onError: Consumer<in Throwable>,
    val onComplete: Action,
    val dbController: DatabaseController,
    val lnController: ILoginNetworkController
) : BaseSO() {
    @SuppressLint("CheckResult")
    fun execute() {
    }
}

在您的活动中:

lateinit var dataKlass: MyDataKlass @Inject set

当然,你的依赖图必须指定如何提供数据类的所有参数。


推荐阅读