Android kotlin сопрограммы возвращают объект из областей жизненного цикла - PullRequest
1 голос
/ 15 февраля 2020

У меня есть функция 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, found: ProductCats?. Как я могу преобразовать функцию getNewProduct и заставить ее вернуть желаемый объект вместо ob job?

Ответы [ 2 ]

0 голосов
/ 15 февраля 2020

Если вы хотите получить результат, вы можете использовать asyn c вместо запуска

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()
0 голосов
/ 15 февраля 2020

Попробуйте с этим

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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...