所以我有这个代码,当我按下按钮时
btnLogin.setOnClickListener {
val user = UserLogin(etUsername.text.toString(), etPassword.text.toString())
viewModel.login(user)
}
我会观察这个
fun login(user: UserLogin) {
loginGateway.loginBuyer(user)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnSubscribe { _loginState.postValue(LoginLoading) }
.subscribe({
if(it.data != null)
_loginState.postValue(LoginSuccess(it.data))
else
_loginState.postValue(LoginFailed(it.message))
}, {
_loginState.postValue(LoginError(it.localizedMessage))
})
.addTo(disposable)
}
这是观察者
viewModel.loginState.observe(this, Observer {it ->
when (it) {
LoginLoading -> {
dialog.show()
}
is LoginSuccess -> {
dialog.dismiss()
if (cbRemember.isChecked)
viewModel.saveUsername(etUsername.text!!.toString())
viewModel.saveFirstname(it.user.firstName)
findNavController().navigate(R.id.toMain)
}
is LoginFailed -> {
dialog.dismiss()
showErrorDialog(this.context!!, "Login Failed", it.message)
}
is LoginError -> {
dialog.dismiss()
showErrorDialog(this.context!!, "Login Error", it.message)
}
}
})
所以这就是当我登录失败时出现的问题,因此它会显示一个对话框,当关闭时以及当我转到注册页面并返回登录时,仍然会出现相同的对话框。
我尝试将
removeObservers(this)
放在 onPause() 和 onDestroy() 上,但它仍然是一样的。我不太确定问题是否在于片段生命周期,如果不是,请帮助我了解发生了什么。我是 kotlin 和 mvvm 的新手,所以请。谢谢:)
场
viewModel.loginState
就像它被命名为一种生活在viewModel
内的状态。当您导航到导航时,观察将暂停,但在您导航回来后也会重新启动。由于您不更改状态本身,可能只是关闭对话框,因此您最终会看到与以前相同的屏幕。
因此,当您关闭对话框时,只需将状态更新为更相关的值即可。
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
viewModel.isDialogOpen.observe(viewLifecycleOwner) { isDialogOpen ->
if (!isDialogOpen) {
[email protected]()
}
}
}
我有一个set btn,当单击set btn时,我将这个变量isDialogOpen设置为false,有时,obsever不起作用并且它不会进入if条件。