用户登录无法使用改造和视图模型

user login is not working using retrofit and viewmodel

我的登录不工作..我正在使用改造和视图模型...实际上场景是点击登录显示转换(登录页面到登录页面)但它没有从登录页面移动到主页....

此方法model.ResponseData.observe未被调用

我不知道我哪里错了

需要帮助谢谢

登录活动:--

class LoginActivity : AppCompatActivity() {
lateinit var model: LoginViewModel

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.login_activity)

    val button = findViewById<ImageView>(R.id.plusbutton)
    val forgotpassword=findViewById<TextView>(R.id.forgotpassword)
    button.setOnClickListener {
        val i = Intent(applicationContext, RegisterActivity::class.java)
        startActivity(i)
    }
    forgotpassword.setOnClickListener{
        val i = Intent(applicationContext, ForgotPassword::class.java)
        startActivity(i)
    }
    model = ViewModelProvider(this)[LoginViewModel::class.java]

    model.ResponseData.observe(this, object : Observer<LoginResponse?> {
        override fun onChanged(t: LoginResponse?) {
            val intent = Intent(applicationContext, HomeActivity::class.java)
            intent.flags =
                Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
            startActivity(intent)
            finish()
        }

    })
    loginbtn.setOnClickListener {
        val email = loginuser.text.toString().trim()
        val password = loginpassword.text.toString().trim()

        if (email.isEmpty()) {
            Toast.makeText(
                applicationContext, "Data is missing", Toast.LENGTH_LONG
            ).show()
            loginuser.error = "Email required"
            loginuser.requestFocus()
            return@setOnClickListener
        } else if (password.isEmpty()) {
            loginpassword.error = "Password required"
            loginpassword.requestFocus()
            return@setOnClickListener
        }
        else {
       model.loadAccountData(email,password)

        }
    }
}}

视图模型:--

class LoginViewModel(context: Application,private val savedStateHandle: SavedStateHandle) : AndroidViewModel(context) {
private var _aResponseData = MutableLiveData<LoginResponse?>()

val user: MutableLiveData<String> = savedStateHandle.getLiveData("user", "")
val password: MutableLiveData<String> = savedStateHandle.getLiveData("password", "")
val ResponseData: MutableLiveData<LoginResponse?>



get() {

    if (_aResponseData == null) {
        _aResponseData = MutableLiveData<LoginResponse?>()
        loadAccountData(user.toString(), password.toString())
    }
    return _aResponseData
}


fun loadAccountData(email:String, password:String) {


    RetrofitClient.instance.userLogin(email, password)
        .enqueue(object : Callback<LoginResponse> {
            override fun onFailure(call: Call<LoginResponse>, t: Throwable) {
                Log.d("res", "" + t)
                _aResponseData.value = null
            }

            override fun onResponse(
                call: Call<LoginResponse>,
                response: Response<LoginResponse>
            ) {
                var res = response

                if (res.body()?.status == 200) {
                    _aResponseData.value = response.body()
                } else {
                    try {
                        val jObjError =
                            JSONObject(response.errorBody()!!.string())
                        Toast.makeText(
                            getApplication(),
                            jObjError.getString("user_msg"),
                            Toast.LENGTH_LONG
                        ).show()
                    } catch (e: Exception) {
                        Log.e("errorrr", e.message)
                    }
                }
            }
        })
}
}

试试这个

 if (res.body()?.status == 200) {
                _aResponseData.postValue(response.body()) 
            }

经过讨论和调试,问题似乎不在观察者身上,而是在通过改造解析来自 API 调用的响应期间。

_aResponseData.value = response.body()

此处 response.body() 无法将响应解析为 LoginResponse class 对象,这最终在导航上引起了更多问题。

解决解析问题有帮助O.P。通过对主要问题的调试。