Search code examples
androidsqlitekotlinauthenticationandroid-room

How to manage Login Validation with Room in Kotlin?


I'm trying to make work the Login Validation form, but the program stops then reaches the second if, and I have Invalid email output. Run is clear and out of mistakes. Can't figure out what I'm doing wrong and why emailList is null

    private fun logIn() {
    val email = binding.editEmailAddress.text.toString()
    val password = binding.editPassword.text.toString()
    if (inputCheck(email, password)) {
        mLoginViewModel = ViewModelProvider(this)[LoginViewModel::class.java]
        val emailList = mLoginViewModel.getUserEmail(email)
        if (emailList != null) {
            if (emailList.password == password) {
                Toast.makeText(requireContext(), "Logged in as $email", Toast.LENGTH_LONG)
                    .show()
                findNavController().navigate(R.id.action_loginFragment_to_listFragment)
            } else {
                Toast.makeText(requireContext(), "Invalid password", Toast.LENGTH_SHORT).show()
            }
        } else {
            Toast.makeText(requireContext(), "Invalid email", Toast.LENGTH_SHORT).show()
        }
    } else {
        Toast.makeText(requireContext(), "Fill out blank fields", Toast.LENGTH_LONG).show()
    }
}

private fun inputCheck(email: String, password: String): Boolean {
    return !(TextUtils.isEmpty(email) || TextUtils.isEmpty(password))
}

LoginViewModel

    fun getUserEmail(email: String): User? {
    var checker: User? = null
    viewModelScope.launch(Dispatchers.IO) {
        checker = repository.getUserEmail(email)
    }
    return checker
}

Solution

  • fun getUserEmail(email: String): User? {
        var checker: User? = null
        viewModelScope.launch(Dispatchers.IO) {
            checker = repository.getUserEmail(email)
        }
        return checker 
        // Will return null always because this is not waiting to assign value by above repository method
    }
    

    Insted you can do this

    suspend fun getUserEmail(email: String): User? {
        return repository.getUserEmail(email)
    }
    

    And in Activity Or Fragment

    mLoginViewModel = ViewModelProvider(this)[LoginViewModel::class.java]
    lifecycleScope.launch {
        val emailList = mLoginViewModel.getUserEmail(email)
    }
    

    Don't Know what error you are getting on above code if that not works then use below code

    mLoginViewModel = ViewModelProvider(this)[LoginViewModel::class.java]
        CoroutineScope(Dispatchers.IO).launch {
            val emailList = mLoginViewModel.getUserEmail(email)
            withContext(Dispatchers.Main){
                //Do whatever with emailList
            }
        }