如何从登录用户返回布尔值



你好,我在kotlin做mvvm项目,我使用房间登录并注册新用户。

部分代码:

view.login_btn.setOnClickListener {
val takenUsername = username.text.toString()
val takenPassword = password.text.toString()
if(takenUsername.isEmpty() || takenPassword.isEmpty()){
Toast.makeText(context, "Fill all columns", Toast.LENGTH_SHORT).show()
}else{
//Zwraca unity (naprawic to a nie null
val userEntity  = mMainActivityViewModel.checkLogin(takenUsername,takenPassword)
if(userEntity.equals(null)){
Toast.makeText(context!!, "Bad login or password", Toast.LENGTH_SHORT).show()
}else{
Toast.makeText(context!!, "Login successfull", Toast.LENGTH_SHORT).show()
}
}
}

我不明白为什么,但是这个函数返回的单位不是null。我完全不知道。

有人能提出我应该在第11行写什么而不是空吗?

我的朋友,你走错了路。您需要使用实时数据从视图模型中获取回调。

private fun setupLoginObserver() {
mMainActivityViewModel.loginStatus.observe(this, Observer { isValidUser ->
if (isValidUser) {
Toast.makeText(requireContext(), "Login successful", Toast.LENGTH_SHORT).show()
} else {
Toast.makeText(requireContext(), "Bad login or password", Toast.LENGTH_SHORT).show()
}
})
}

您可以从onViewCreated((调用此方法

你的按钮点击监听器应该是这样的:

view.login_btn.setOnClickListener {
val takenUsername = username.text.toString()
val takenPassword = password.text.toString()
if (takenUsername.isEmpty() || takenPassword.isEmpty()) {
Toast.makeText(context, "Fill all columns", Toast.LENGTH_SHORT).show()
} else {
//Check user is valid or not in db and you will get the callback on line #
mMainActivityViewModel.checkLogin(takenUsername, takenPassword)
}
}

ViewModel:

fun checkLogin(username: String, password: String) {
viewModelScope.launch(Dispatchers.IO) {
repository.loginUser(username, password)?.let {
mutableLoginStatus.postValue(true)
} ?: mutableLoginStatus.postValue(false)
}
}

UserRepository:

suspend fun loginUser(username: String, password: String): User? {
return userDao.loginUser(username, password)
}

最后是UserDao:

@Query("SELECT user_table.* FROM user_table WHERE username= :username AND password=:password")
suspend fun  loginUser(username: String, password: String): User?

我在您的代码中做了一些必要的更改,并在这个分支中进行了推送。

https://github.com/parmeshtoyou/Querto/tree/user_validate_through_live_data_stackoverflow

您可以查看更改。

如果你需要澄清,请告诉我。

快乐编码。

您可以使用function返回布尔值,如以下

view.login_btn.setOnClickListener {
loginUser()
}
fun loginUser():Boolean{
val takenUsername = username.text.toString()
val takenPassword = password.text.toString()
if(takenUsername.isEmpty() || takenPassword.isEmpty()){
Toast.makeText(context, "Fill all columns", Toast.LENGTH_SHORT).show()
return false
}else{
//Zwraca unity (naprawic to a nie null
val userEntity  = mMainActivityViewModel.checkLogin(takenUsername,takenPassword)
if(userEntity.equals(null)){
Toast.makeText(context!!, "Bad login or password", Toast.LENGTH_SHORT).show()
return false
}else{
Toast.makeText(context!!, "Login successfull", Toast.LENGTH_SHORT).show()
return true
}
}
}
}

在MVVM架构中,我们可以使用LiveData,从ViewModel 中获取值

在ViewModel中,我们可以验证登录成功与否,

fun checkLogin(username: String, password: String) {
// Perform Login validation
validUser.setValue(true) // set the livedata as true on login validation Success
validUser.setValue(false) // set the livedata as true on login validation falied
}

不活动您可以观察LivedataChanges

mMainActivityViewModel.validUser.observe(this, Observer<Boolean> {validUser:Boolean? ->
if(validUser){
Toast.makeText(this, "Login successfull", Toast.LENGTH_SHORT).show()
}
else{
Toast.makeText(this, "Login Failed", Toast.LENGTH_SHORT).show()
}
})

在OnClickListener 中

view.login_btn.setOnClickListener {
val takenUsername = username.text.toString()
val takenPassword = password.text.toString()
if(takenUsername.isEmpty() || takenPassword.isEmpty()){
Toast.makeText(context, "Fill all columns", Toast.LENGTH_SHORT).show()
}else{
// just call the method and set the Livedata value based on the validation 
mMainActivityViewModel.checkLogin(takenUsername,takenPassword)
}
}

最新更新