Android kotlin协程从生命周期范围返回对象

Android kotlin协程从生命周期范围返回对象,android,kotlin,Android,Kotlin,我有一个函数getNewProduct,它应该返回ProductCats类型的对象。在这个函数中,我调用了一个Async方法,我应该通过协程作用域调用它。这是代码: private fun addProductCatAsync(pc: ProductCats) = viewModelScope.async { withContext(Dispatchers.Default){ productService.addProductCatToServer

我有一个函数
getNewProduct
,它应该返回
ProductCats
类型的对象。在这个函数中,我调用了一个
Async
方法,我应该通过协程作用域调用它。这是代码:

    private fun addProductCatAsync(pc: ProductCats) = viewModelScope.async {
        withContext(Dispatchers.Default){
            productService.addProductCatToServer(pc)
        }
    }

    fun getNewProduct(pc: ProductCats) = viewModelScope.launch{

        if (_newProduct.value == null) {
            val res = addProductCatAsync(pc).await()
            _newProduct.value = res
            println("NEW PRODUCT INSIDE COROUTINE: ${_newProduct.value}")
            return@launch res
        }
        return@launch _newProduct.value
    }
但我在编译时从返回行中得到了这个错误:
required:Unit,find:ProductCats?
。如何转换
getNewProduct
函数并使其返回所需的对象而不是ob
job

尝试使用此方法

fun getNewProduct(pc: ProductCats): ProductCats{
    label@GlobalScope.launch{
        if (_newProduct.value == null) {
        val res = addProductCatAsync(pc).await()
        _newProduct.value = res
        println("NEW PRODUCT INSIDE COROUTINE: ${_newProduct.value}")
        return@label res
    }
    return _newProduct.value
}



GlobalScope.launch will return job object.
试试这个

fun getNewProduct(pc: ProductCats): ProductCats{
    label@GlobalScope.launch{
        if (_newProduct.value == null) {
        val res = addProductCatAsync(pc).await()
        _newProduct.value = res
        println("NEW PRODUCT INSIDE COROUTINE: ${_newProduct.value}")
        return@label res
    }
    return _newProduct.value
}



GlobalScope.launch will return job object.

如果您想要获取结果,可以使用异步启动

fun getNewProduct(pc: ProductCats) = viewModelScope.async {
if (_newProduct.value == null) {
    val res = addProductCatAsync(pc).await()
    _newProduct.value = res
    println("NEW PRODUCT INSIDE COROUTINE: ${_newProduct.value}")
}
_newProduct.value
}.await()

如果您想要获取结果,可以使用异步启动

fun getNewProduct(pc: ProductCats) = viewModelScope.async {
if (_newProduct.value == null) {
    val res = addProductCatAsync(pc).await()
    _newProduct.value = res
    println("NEW PRODUCT INSIDE COROUTINE: ${_newProduct.value}")
}
_newProduct.value
}.await()

除非函数是挂起函数,否则此操作将不起作用。除非函数是挂起函数,否则此操作将不起作用。这将启动作业,然后返回作业开始前
\u newProduct
具有的值。这将启动作业,然后返回作业开始前
\u newProduct
具有的值。