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/3/clojure/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 科特林:有可能通过两个';这';在函数中?_Android_Kotlin - Fatal编程技术网

Android 科特林:有可能通过两个';这';在函数中?

Android 科特林:有可能通过两个';这';在函数中?,android,kotlin,Android,Kotlin,使用下面的代码,我得到了以下错误:“挂起函数'getSomethingFromAPI'应该只从一个协同程序或另一个挂起函数调用。”,这是当前的。getSomethingFromAPI实际上是ViewModel的一个挂起函数 override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) viewModel =

使用下面的代码,我得到了以下错误:“挂起函数'getSomethingFromAPI'应该只从一个协同程序或另一个挂起函数调用。”,这是当前的。getSomethingFromAPI实际上是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()
        }