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

Retrofit回调类型不匹配求助:登录API调用报错

Retrofit Callback类型不匹配错误修复

问题分析

报错Type mismatch. Required: Callback<AuthenticationResponse!>! Found: ,本质是Retrofit回调的泛型类型与预期不匹配,大概率是导入错误或Kotlin与Java平台类型的兼容问题。

修复步骤

1. 确认Callback的正确导入

必须导入Retrofit官方的Callback类,避免和Android系统或其他库的Callback混淆:

import retrofit2.Callback
import retrofit2.Call
import retrofit2.Response

如果之前导入的是androidx.core.util.Callback或其他,直接替换成上面的导入。

2. 适配Kotlin的可空性声明

由于Retrofit是Java库,返回的类型带平台标记!,在Kotlin中可以显式指定泛型的可空性来匹配:
修改回调的声明为:

authService.login(authenticationRequest).enqueue(object : Callback<AuthenticationResponse?> {
    override fun onResponse(call: Call<AuthenticationResponse?>, response: Response<AuthenticationResponse?>) {
        // 原有逻辑保持不变,你已经对response.body()做了判空,无需额外修改
    }

    override fun onFailure(call: Call<AuthenticationResponse?>, t: Throwable) {
        // 原有逻辑保持不变
    }
})

如果你的AuthenticationResponse在Retrofit接口中被声明为非空类型,也可以直接使用Callback<AuthenticationResponse>,只要确保导入正确即可。

3. 校验AuthService接口定义

检查你的AuthService中login方法的返回类型是否和回调泛型一致,示例正确的接口定义:

interface AuthService {
    @POST("api/auth/login") // 替换成你的实际接口路径
    fun login(@Body request: AuthenticationRequest): Call<AuthenticationResponse>
}

如果接口返回的是Call<AuthenticationResponse?>,则回调也要对应使用可空泛型。

额外补充:Token存储实现

既然需要用返回的token和refresh token作为后续接口的Bearer令牌,在登录成功后记得持久化存储这两个值,推荐用SharedPreferences:

if (authenticationResponse != null) {
    // 存储Token到SharedPreferences
    val authPrefs = requireContext().getSharedPreferences("AuthStorage", Context.MODE_PRIVATE)
    authPrefs.edit()
        .putString("access_token", authenticationResponse.token)
        .putString("refresh_token", authenticationResponse.refreshToken)
        .apply()
    
    // 跳转至Dashboard
    findNavController().navigate(LoginNewFragmentDirections.actionLoginToDashboard())
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 11:02:34