Здравствуйте
Я делаю проект 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()
}
}
}
Я не понимаю, почему, но эта функция возвращает единицу, а не нуль, чего я совершенно не знаю.
Может ли кто-нибудь предложить, что я должен поставить вместо нуля в строке 11
2 ответа
Вы ошибаетесь, мой друг. Вам нужно использовать живые данные, чтобы получить обратный вызов из модели представления.
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
}
}
}
}
Похожие вопросы
Новые вопросы
android
Android — это мобильная операционная система Google, используемая для программирования или разработки цифровых устройств (смартфонов, планшетов, автомобилей, телевизоров, одежды, очков, IoT). Для тем, связанных с Android, используйте теги, специфичные для Android, такие как android-intent, android-activity, android-adapter и т. д. Для вопросов, отличных от разработки или программирования, но связанных с Android framework, используйте эту ссылку: https://android .stackexchange.com.