如何在 Kotlin 中从回调返回值?

问题描述 投票:0回答:1

这种情况下如何将结果发送到ViewModel???

val callback: (OAuthToken?, Throwable?) -> Unit = { token, error ->
    if (error != null) {
        // TODO: error return to viewModel
    } else if (token != null) {
        // TODO: success return to viewModel
    }
}

fun signInWithABC() {
    abcApi.signIn(callback = callback)
}

我认为signInWithABC应该返回到ViewModel,而不是直接从回调返回...... 也许像这样..

fun signInWithABC(): Result<AuthData> {
    return abcApi.signIn(callback = callback)
}

但是,我不知道该怎么做..

我应该这样修复它吗?不过看起来不太干净。

fun signInWithABC() {
    abcApi.signIn(){ token, error ->
        if (error != null) {
            // TODO: error return to viewModel
        } else if (token != null) {
            // TODO: success return to viewModel
        }
    }
}

我也尝试过这个..但它有返回问题。 lamda 无法返回该函数的值。但只能返回区块..

fun signInWithABC(): Result<String> {
    abcApi.signIn(){ token, error ->
        if (error != null) {
            return Result.failure<Throwable>(error)
        } else if (token != null) {
            return Result.success(token)
        }
    }
    return Result.failure(throw IllegalAccessException())
}
android kotlin callback
1个回答
9
投票

您可能需要回调来暂停转换。 这是执行此操作的一个简单示例:

suspend fun signInWithABC(): String = suspendCoroutine { continuation -> 
        abcApi.signIn(){ token, error ->
            if (error != null) {
               continuation.resume("Error")
            } else {
               continuation.resume(token) // Assuming token is a string
            }
        }            
    }
© www.soinside.com 2019 - 2024. All rights reserved.