LiveData 观察者触发先前的响应

问题描述 投票:0回答:1

在我的登录页面中,当我使用有效的电子邮件和密码单击登录按钮时,它将进入主页。然后当我从那里注销并重定向到登录页面时。然后我面临的是,当我点击登录时,它首先进入主页[即使我输入或不输入任何凭据]。我希望每当单击登录按钮时都会检查一次。我认为它观察了以前的数据。

在登录片段中,当我单击登录按钮时,我调用了此方法:

   private fun loginCheck(email: String, pass: String) {

   val loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java]
    loginViewModel.loginResponse(requireContext(), email, pass, object : ProgressCallback {
        val opusLoader = OpusProgressLoader(requireContext())
        override fun onStart() {

            opusLoader.customDialogFunctionality(isCancelable = true)
        }

        override fun onFinish() {

            opusLoader.customDialogFunctionality(isCancelable = false)
        }
    })
        .observe(viewLifecycleOwner, Observer { loginPojo ->

            val accessToken = loginPojo.access_token
            if (accessToken.isNotEmpty()) {
                 Navigation.findNavController(requireView()).navigate(R.id.homepage)
                 requireActivity().finish()

            } else Toast.makeText(requireContext(), "Failed", Toast.LENGTH_SHORT).show()
        })
}

我的视图模型:

    class LoginViewModel(application: Application) : AndroidViewModel(application) {

private val loginRepo = AuthRepoImpl.getInstance()


    fun loginResponse(
        context: Context,
        username: String,
        password: String,
        progressCallback: ProgressCallback
    ): LiveData<LoginPojo> {

        return  loginRepo.cLoginResponse(context, username, password,progressCallback)
    }
}

和存储库方法:

    override fun cLoginResponse(
    context: Context,
    username: String,
    password: String,
    progressCallback: ProgressCallback
): MutableLiveData<LoginPojo> {

    progressCallback.onStart()
    val apiServices = rInstance.getRetrofitInstance()?.create(ApiServices::class.java)
    val requestBody = LoginBody(username, password)

    val call = apiServices?.getUser( requestBody)

    try {
        call?.enqueue(object : Callback<LoginPojo> {
            override fun onResponse(
                call: Call<LoginPojo>,
                response: Response<LoginPojo>
            ) {
                
                progressCallback.onFinish()
                mLivedata.postValue(loginResponse!!)
            }

            override fun onFailure(call: Call<LoginPojo>, t: Throwable) {
                progressCallback.onFinish()
                Toast.makeText(context, "Login Failed", Toast.LENGTH_SHORT).show()
            }
        })
    } catch (e: Exception) {
        e.printStackTrace()
        progressCallback.onFinish()
        Toast.makeText(context, "Login Failed", Toast.LENGTH_SHORT).show()
    }
    return mLivedata
}
kotlin android-livedata android-viewmodel android-mvvm
1个回答
1
投票

您可以尝试在登录时清除ViewModel并重定向到登录片段。

© www.soinside.com 2019 - 2024. All rights reserved.