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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/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
Dependency injection 如何注入数据类_Dependency Injection_Kotlin_Koin - Fatal编程技术网

Dependency injection 如何注入数据类

Dependency injection 如何注入数据类,dependency-injection,kotlin,koin,Dependency Injection,Kotlin,Koin,我有一个数据类注入的问题 数据类: data class CoroutinesDispatcherProvider( val main: CoroutineDispatcher, val computation: CoroutineDispatcher, val io: CoroutineDispatcher ) class MyViewModel(private val dispatcherProvider: CoroutinesDispatcherProvider)

我有一个数据类注入的问题

数据类:

data class CoroutinesDispatcherProvider(
    val main: CoroutineDispatcher,
    val computation: CoroutineDispatcher,
    val io: CoroutineDispatcher
)
class MyViewModel(private val dispatcherProvider: CoroutinesDispatcherProvider):ViewModel() {

}
而viewModel需要此数据类:

data class CoroutinesDispatcherProvider(
    val main: CoroutineDispatcher,
    val computation: CoroutineDispatcher,
    val io: CoroutineDispatcher
)
class MyViewModel(private val dispatcherProvider: CoroutinesDispatcherProvider):ViewModel() {

}
最后一个模块是:

val appModule = module {
    single { (main: CoroutineDispatcher, computation: CoroutineDispatcher, io: CoroutineDispatcher) ->
        CoroutinesDispatcherProvider(
            main,
            computation,
            io
        )
    }
    viewModel { MyViewModel(get()) }
}
但是得到错误:

Caused by: org.koin.error.BeanInstanceCreationException: Can't create definition for 'Factory [name='MyViewModel',class='com.example.myapplication.MyViewModel', binds~(androidx.lifecycle.ViewModel)]' due to error :
        Can't create definition for 'Single [name='CoroutinesDispatcherProvider',class='com.example.myapplication.CoroutinesDispatcherProvider']' due to error :
        Can't get parameter value #0 from org.koin.core.parameter.ParameterList@f87fb6

appModule出了什么问题

由于在单个声明中使用lambda,因此应该使用
parametersOf()
解析依赖关系。但是您首先需要初始化provider变量,因为您的
viewModel
依赖于它:

data class CoroutinesDispatcherProvider(val main: CoroutineDispatcher, val computation: CoroutineDispatcher, val io: CoroutineDispatcher)

class MyViewModel(private val dispatcherProvider: CoroutinesDispatcherProvider) : ViewModel() {
    fun helloworld() {
        println("dispatcher: $dispatcherProvider")
    }
}


val appModule = module {
    single { (main: CoroutineDispatcher, computation: CoroutineDispatcher, io: CoroutineDispatcher) ->
        CoroutinesDispatcherProvider(main, computation, io)
    }
    viewModel { MyViewModel(get()) }
}


class MyKoinTest : KoinTest {
    val provider: CoroutinesDispatcherProvider by inject { parametersOf(Dispatchers.Main, Dispatchers.Default, Dispatchers.IO)}
    val viewModel: MyViewModel by inject { parametersOf(provider)}

    @Before
    fun before() {
        startKoin(listOf(appModule))
    }

    @Test
    fun test1() {
        viewModel.helloworld()
    }
}
我使用了这些依赖项(
koin_version='1.0.2'
):


请尝试下面我的解决方案