【发布时间】:2022-01-09 14:46:45
【问题描述】:
所以我开始构建一个聊天应用程序,现在我在注册屏幕。
每次我按下登录按钮,请求只发送一次,就像它应该做的那样。 当我返回错误消息(例如“您的密码不正确”)时,问题就开始了,在我收到错误消息后,我再次使用相同的错误密码按下登录按钮,我收到了我所做的日志错误,但它同时显示 3 次,firebase 告诉我尝试次数过多....
这就是我所做的:
视图模型:
private val _authState by lazy { MutableLiveData<AuthState>(AuthState.Loading) }
val authState: LiveData<AuthState> = _authState
fun loginUser(emailAddress: String, password: String) {
if (!isEmailAddressValid(emailAddress)) {
_authState.value = AuthState.AuthError("Invalid email")
return
} else if (password.isEmpty()) {
_authState.value = AuthState.AuthError("Password field can't be empty")
return
} else if (emailAddress.isEmpty()) {
_authState.value = AuthState.AuthError("Email field can't be empty")
return
}
auth.signInWithEmailAndPassword(emailAddress, password).addOnCompleteListener { task ->
if (task.isSuccessful) {
_authState.value = AuthState.Success
} else {
task.exception?.let {
_authState.value = AuthState.AuthError(it.localizedMessage)
}
}
}
}
这是活动:
binding.loginButton.setOnClickListener {
val emailEditText = binding.emailAddressEditText.text.toString()
val passwordEditText = binding.passwordEditText.text.toString()
registerLoginViewModel.loginUser(emailEditText, passwordEditText)
registerLoginViewModel.authState.observe(this@LoginRegisterActivity, object : Observer<AuthState?> {
override fun onChanged(loginState: AuthState?) {
when (loginState) {
is AuthState.Success -> {
hideLoadingScreen()
Toast.makeText(this@LoginRegisterActivity,"Welcome Back!",Toast.LENGTH_SHORT).show()
Intent(this@LoginRegisterActivity, MainActivity::class.java)
finish()
}
is AuthState.AuthError -> {
hideLoadingScreen()
Log.e("Error:","Error Message: ${loginState.message}") // This line returns 3 times after the second attempt
Toast.makeText(this@LoginRegisterActivity,loginState.message,Toast.LENGTH_SHORT).show()
}
else -> {
showLoadingScreen()
}
}
}
})
}
谢谢!
【问题讨论】:
-
请注意:
LiveData.observe(...)不需要在任何类型的侦听器中。您可以在 API 调用之前在 Activity 的onCreate()中观察。就像现在在您的代码中一样,每次调用您的点击侦听器时,您都会添加一个新的观察者。 -
听起来像一个答案@rupinderjeet! ??????
-
谢谢@rupinderjeet!
-
@rupinderjeet 同意 Frank van Puffelen 的观点。您应该添加一个答案。
标签: android kotlin mvvm firebase-authentication android-viewmodel