【问题标题】:Kotlin: Is it possible to pass two 'this' in a function?Kotlin:是否可以在一个函数中传递两个“this”?
【发布时间】:2020-06-18 05:38:10
【问题描述】:

使用下面的代码,我收到以下错误:“暂停函数 '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() } }

正如您所看到的,在 applelaunch 函数中,我正在协程(启动)内执行 getSomethingFromAPI,但此信息丢失了。有什么办法可以同时保留 T 作为 ViewModel 吗?

更具体地说,是否可以有一个快捷函数来实现以下代码的前两行?

        viewModel.apply {
            viewModelScope.launch(Dispatchers.IO) {
                 getSomethingFromAPI()
        }

上面的getSomethingFromAPI 可以同时看到“this”(ViewModel 和协程)。

我知道拥有它并不重要,但知道它对于创建 DSL 可能是件好事。

【问题讨论】:

    标签: android kotlin


    【解决方案1】:

    您收到此错误是因为您尝试在非挂起 lambda 中调用挂起函数。使 applyLaunch 中的 lambda 暂停 block: suspend T.() -&gt; Unit

    【讨论】:

    • 最好把applyLaunchinline也做成。
    • 很好,它确实有效! inline fun &lt;T: ViewModel&gt; T.applyLaunch(crossinline block: suspend T.() -&gt; Unit) 在这么小的函数中使用 inline 有什么真正的好处吗?
    • inline 对几乎所有高阶函数都有好处,因为它可以防止为 lambda 实例化包装类。
    猜你喜欢
    • 1970-01-01
    • 2016-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多