Android 科特林:有可能通过两个';这';在函数中?
使用下面的代码,我得到了以下错误:“挂起函数'getSomethingFromAPI'应该只从一个协同程序或另一个挂起函数调用。”,这是当前的。getSomethingFromAPI实际上是ViewModel的一个挂起函数Android 科特林:有可能通过两个';这';在函数中?,android,kotlin,Android,Kotlin,使用下面的代码,我得到了以下错误:“挂起函数'getSomethingFromAPI'应该只从一个协同程序或另一个挂起函数调用。”,这是当前的。getSomethingFromAPI实际上是ViewModel的一个挂起函数 override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) viewModel =
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
viewModel = ViewModelProvider(this).get(CallVM::class.java)
viewModel.applyLaunch {
this.getSomethingFromAPI()
}
}
fun <T: ViewModel> T.applyLaunch(block: T.() -> Unit)
= apply { viewModelScope.launch(Dispatchers.IO) { block() } }
上面的getSomethingFromAPI可以同时看到“this”(ViewModel和coroutine)
我知道拥有它并不重要,但知道如何创建DSL可能会很好。您遇到此错误,因为您试图在非挂起lambda中调用挂起函数。在applyLaunch suspend
块中生成lambda:suspend T.()->Unit
最好同时生成applyLaunch
内联
。很好,它确实有效inline fun T.applyLaunch(crossinline块:suspend T.()->Unit)
在这么小的函数中使用inline有什么真正的好处吗?inline
几乎对任何高阶函数都有好处,因为它可以防止为lambda实例化包装类。
viewModel.apply {
viewModelScope.launch(Dispatchers.IO) {
getSomethingFromAPI()
}