Как вернуть значение на addOnCompleteListener Firebase? - PullRequest
1 голос
/ 09 мая 2020

У меня есть логин, связанный с моим приложением firebase. Я хочу вернуть значение для полного слушателя.

class LoginDataSource {

    private lateinit var user: LoggedInUser

    fun login(username: String, password: String, mAuth: FirebaseAuth): Result<LoggedInUser> {
        try {
            mAuth.createUserWithEmailAndPassword(username, password)
                .addOnCompleteListener { task ->
                    if (task.isSuccessful) {
                        // Sign in success, update object with the signed-in user's information
                        val currentUser = mAuth.currentUser
                        if (currentUser != null) {
                            user = LoggedInUser(currentUser.uid, currentUser.email!!)
                        }
                        return Result.Success(user)
                    } else {
                        // If sign in fails, display a message to the user.
                        Log.d("Login", "createUserWithEmail:failure")
                    }
                }

            return Result.Success(user)
        } catch (e: Throwable) {
            return Result.Error(IOException("Error logging in", e))
        }
    }
}

Обновление:

Мой класс LoginRepository

class LoginRepository(val dataSource: LoginDataSource) {

    fun login(username: String, password: String, mAuth: FirebaseAuth): Result<LoggedInUser> {
        // handle login
        val result = dataSource.login(username, password, mAuth)

        if (result is Result.Success) {
            setLoggedInUser(result.data)
        }

        return result
    }
}

Мой класс LoginViewModel

class LoginViewModel(private val loginRepository: LoginRepository) : ViewModel() {

    private val _loginForm = MutableLiveData<LoginFormState>()
    val loginFormState: LiveData<LoginFormState> = _loginForm

    private val _loginResult = MutableLiveData<LoginResult>()
    val loginResult: LiveData<LoginResult> = _loginResult

    fun login(username: String, password: String, mAuth: FirebaseAuth) {
        // can be launched in a separate asynchronous job
        val result = loginRepository.login(username, password, mAuth)

        if (result is Result.Success) {
            _loginResult.value = LoginResult(success = LoggedInUserView(displayName = result.data.displayName))
        } else {
            _loginResult.value = LoginResult(error = R.string.login_failed)
        }
    }
}

Этот код является шаблоном из Activity Login при первом создании приложения. Есть предложения?

1 Ответ

1 голос
/ 09 мая 2020

вместо того, чтобы возвращать значение в слушателе, вы можете вызвать функцию, например

fun gotResult(user: LoggedInUser){
// you can do your logic here, once you get the result
} 

изменить return Result.Success(user) на gotResult(user)

надеюсь, что это поможет

ОБНОВЛЕНИЕ:

, поскольку вы используете модель просмотра и живые данные, вы можете передать живые данные вызову входа

fun login(username: String, password: String, mAuth: FirebaseAuth, user: MutableLiveData<LoggedInUser>)

ваш LoginViewModel будет подписываться на эти данные, и LoginDataSource изменит их на Завершение

...