【问题标题】:How to inject data class如何注入数据类
【发布时间】:2018-11-01 14:52:34
【问题描述】:

我遇到了数据类注入的问题。

数据类:

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

而viewModel需要这个数据类:

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 出了什么问题?!

【问题讨论】:

  • 请在下面尝试我的解决方案

标签: dependency-injection kotlin koin


【解决方案1】:

由于您在单个声明中使用 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'):

implementation "org.koin:koin-android:$koin_version"
implementation "org.koin:koin-android-scope:$koin_version"
implementation "org.koin:koin-android-viewmodel:$koin_version"
testImplementation "org.koin:koin-test:$koin_version"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-27
    相关资源
    最近更新 更多