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
相关产品推荐
相关产品推荐

