Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何使用Dagger将@Inject注入Kotlin Builder类_Android_Kotlin_Dagger 2 - Fatal编程技术网

Android 如何使用Dagger将@Inject注入Kotlin Builder类

Android 如何使用Dagger将@Inject注入Kotlin Builder类,android,kotlin,dagger-2,Android,Kotlin,Dagger 2,我当前的Android项目使用了许多Kotlin数据类,这些数据类雇用了构建者来构建它们 我希望向Kotlin数据类中注入一个实例 我的每个数据类都有这个基本结构 data class MyDataKlass( val onError: Consumer<in Throwable>, val onComplete: Action, val dbController: Da

我当前的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)
}
目前,我正在将我的数据库(
DatabaseController
)和网络(
ILoginNetworkController
)控制器传递到Kotlin数据类的构建器中

我希望@注入它们,使我的代码“更干净”

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


有可能@Inject到Kotlin数据类中吗?

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

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

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

我看不出如何@提供我的数据Klass并仍然使用不同的值来构建它们。匕首允许这样做吗?例如,每次使用我的数据类时,我都必须向它们传递一个唯一的密钥。这取决于应用程序的体系结构。例如,如果每个屏幕都有一个作用域子组件,则可以在相关模块/子模块中提供该键。否则,您可以使用
@Named
注释找到注入给定密钥的方法。使用相同的数据类结构但具有特定属性的另一种方法是扩展
MyDataKlass
,使其具有Dagger可以区分的特定具体类型。我认为这里的谎言是,这不应该是一个数据类,因为它不是
data
,它可以执行
execute()
潜在的异步操作
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