Здравствуйте

Я делаю проект 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

0
fariji1294 5 Дек 2020 в 18:52

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

Вы можете просмотреть изменения.

Дайте мне знать, если вам понадобятся разъяснения.

Удачного кодирования.

1
Parmesh 5 Дек 2020 в 18:21

Вы можете использовать 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

            }
        }
    }
}
0
Daniel Carracedo 5 Дек 2020 в 17:12