首页 > 解决方案 > 尝试使用 RetrofitClient 登录用户时回调类型不匹配 kotlin

问题描述

我试图创建一个用户必须登录的应用程序,并且我正在按照在线教程使用改造客户端,但是即使我正在遵循的教程做了同样的事情并且工作正常,我仍然收到类型不匹配错误。

这是我在我的 LoginActivity 类中用于在用户单击按钮后登录用户的代码:

private fun successfulLogIn(email: String, password: String) {
    val name = et_name.text.toString().trim()
    RetrofitClient.instance.logUserIn(email, password, name)
        .enqueue(object : Callback<LoginResponse>{
            //If login fails
            override fun onFailure(call: Call<LoginResponse>, t: Throwable) {
                Toast.makeText(applicationContext, t.message, Toast.LENGTH_LONG).show()
            }
            //If login is successful
            override fun onResponse(call: Call<LoginResponse>, response: Response<LoginResponse>) {
                if(!response.body()?.error!!){

                    val intent = Intent(applicationContext, HomePageActivity::class.java)
                    intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
                    startActivity(intent)

                }else{
                    Toast.makeText(applicationContext, response.body()?.message, Toast.LENGTH_LONG).show()
                }
            }
        })
}

这是我的 LoginResponse 类:

package com.example.minimoneybox.models
data class LoginResponse(val BearerToken: String, val ExternalSessionId: String, val SessionExternalId: String, val ExpiryInSeconds: Int)

这是我的 RetrofitClient 类:

package com.example.minimoneybox.api

import android.util.Base64
import okhttp3.OkHttpClient
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory

object RetrofitClient {

private val AUTH = "Basic "+ Base64.encodeToString("belalkhan:123456".toByteArray(), Base64.NO_WRAP)

private const val BASE_URL = "https://api-test01.moneyboxapp.com/"

private val okHttpClient = OkHttpClient.Builder()
    .addInterceptor { chain ->
        val original = chain.request()

        val requestBuilder = original.newBuilder()
            .addHeader("Authorization", AUTH)
            .method(original.method(), original.body())

        val request = requestBuilder.build()
        chain.proceed(request)
    }.build()

val instance: Api by lazy{
    val retrofit = Retrofit.Builder()
        .baseUrl(BASE_URL)
        .addConverterFactory(GsonConverterFactory.create())
        .client(okHttpClient)
        .build()

    retrofit.create(Api::class.java)
}
}

最后这是我的 Api 课程

package com.example.minimoneybox.api

import com.example.minimoneybox.models.LoginResponse
import retrofit2.Call
import retrofit2.http.Field
import retrofit2.http.FormUrlEncoded
import retrofit2.http.POST

interface Api {

    @FormUrlEncoded
    @POST("/user/login")
    fun logUserIn(
        @Field("Email") email: String,
        @Field("Password") password: String,
        @Field("Idfs") idfa: String
    ):Call<LoginResponse>
}

我不断得到:

类型不匹配。必需:回调<LoginResponse!>! 成立:

对于 .enqueue() 中的successfulLogIn() 函数,我该如何解决这个问题,以便能够让用户登录?

谢谢

标签: androidapikotlincallbackretrofit

解决方案


推荐阅读