You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin中如何将try catch移至ActivityResult扩展函数侧消除样板代码

问题修正

你当前编写的版本存在三处问题:

  • 遗漏了原有逻辑中resultCode == Activity.RESULT_OK的前置校验,和旧版本行为不统一
  • 函数名存在拼写错误,Execture应为Execute
  • 同一个回调会被触发两次:无异常时传null调用一次,捕获异常后又传异常调用一次,不符合常规回调逻辑
正确实现方案

方案1:沿用你设计的单回调参数思路修正

保留异常作为回调参数传递的逻辑,修复上述问题后的实现如下:

inline fun ActivityResult.newCheckResultAndExecute(block: ActivityResult.(Exception?) -> Unit) {
    if (resultCode != Activity.RESULT_OK) {
        Timber.e("FrameworkUtils: Something went wrong on Registering a ActivityResult")
        // 若需要将resultCode错误也作为异常回传,可在此处调用block(ActivityResultException("Result not ok"))
        return
    }
    try {
        block(null)
    } catch (e: Exception) {
        block(e)
    }
}

调用侧代码:

result.newCheckResultAndExecute { e ->
    // 异常分支处理
    e?.let {
        toast("Error")
        return@newCheckResultAndExecute
    }
    // 正常业务逻辑
    val task = GoogleSignIn.getSignedInAccountFromIntent(data)
    val account = task.getResult(ApiException::class.java)
    loginViewModel.onEvent(LoginRegistrationEvent.SignInWithGoogle(account))
}

方案2:拆分成功/失败回调(更推荐)

将正常业务逻辑和异常处理拆分为两个独立回调,调用侧不需要做空判断,可读性更高:

inline fun ActivityResult.checkResultAndExecute(
    crossinline onError: (Exception) -> Unit,
    crossinline onSuccess: ActivityResult.() -> Unit
) {
    if (resultCode != Activity.RESULT_OK) {
        Timber.e("FrameworkUtils: Something went wrong on Registering a ActivityResult")
        return
    }
    try {
        onSuccess()
    } catch (e: Exception) {
        onError(e)
    }
}

调用侧代码:

result.checkResultAndExecute(
    onError = { toast("Error") }
) {
    val task = GoogleSignIn.getSignedInAccountFromIntent(data)
    val account = task.getResult(ApiException::class.java)
    loginViewModel.onEvent(LoginRegistrationEvent.SignInWithGoogle(account))
}

内容的提问来源于stack exchange,提问作者Andrew。

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 00:06:03