Ошибка в использовании Firestore с компонентами архитектуры Android - PullRequest
0 голосов
/ 10 мая 2019

У меня есть действие, когда пользователь должен войти в систему. Как только пользователь входит в систему, информация о пользователе загружается в Firebase, что наблюдается с использованием LiveData в действии.

Проблема в том, что, несмотря на успешную загрузку данных, LiveData показывает, что произошла ошибка.

Активность

class LoginActivity : AppCompatActivity() {

private val RC_SIGN_IN = 123

private val viewModel by viewModel<LoginViewModel>() // Lazy inject ViewModel

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_login)
    loginUser()
    observeLoginLiveData()
}


private fun observeLoginLiveData() {
    viewModel.onAuthenticationSuccessful().observe(this, Observer { result ->
        when (result) {
            is Result.Loading -> {
            }

            is Result.Success<*> -> {
                startActivity(Intent(this, MainActivity::class.java))
                finish()
            }

            is Result.Error -> {
                clLogin.showSnackbar(R.string.error_login) {}
                Timber.e(result.errorMessage)
            }
        }
    })
 }
}

ViewModel

class LoginViewModel(val repo: LoginRepository) : ViewModel() {

private val _loginLiveData = MutableLiveData<Result>()
private val loginLiveData: LiveData<Result>
    get() = _loginLiveData

fun onAuthenticationSuccessful(): LiveData<Result> {
    _loginLiveData.value = Result.Loading
    viewModelScope.launch {
        _loginLiveData.value = repo.uploadUserDetails()
    }
    return loginLiveData
 }
}

Репозиторий

class LoginRepository {

suspend fun uploadUserDetails(): Result {
val response = withContext(Dispatchers.IO) {
        val currentUser = FirebaseUtils.getCurrentUser()
        val user = User(currentUser?.displayName, currentUser?.email, currentUser?.photoUrl.toString())

        FirebaseFirestore.getInstance()
            .collection(FirebaseReferences.COLLECTION_USERS)
            .add(user)
    }

    return if (response.isSuccessful) {
        Result.Success("true")
    } else {
        Result.Error("Error uploading user data")
    }
 }
}

Я также пытался использовать response.isComplete, но он также возвращает false каждый раз.

Я не знаю, что мне здесь не хватает.Любая помощь будет оценена.Спасибо.

1 Ответ

1 голос
/ 10 мая 2019

Как предлагается в комментарии, я изменил код, чтобы дождаться результата, как показано ниже, и теперь я получаю правильный ответ:

Изменен ViewModel

class LoginViewModel(val repo: LoginRepository) : ViewModel() {

private val _loginLiveData = MutableLiveData<Result>()
private val loginLiveData: LiveData<Result>
    get() = _loginLiveData

fun onAuthenticationSuccessful(): LiveData<Result> {
    _loginLiveData.value = Result.Loading

    viewModelScope.launch {
        repo.uploadUserDetails().addOnCompleteListener {
            if (it.isSuccessful) {
                _loginLiveData.value = Result.Success("true")
            } else {
                _loginLiveData.value = Result.Error("Error uploading user data")
            }
        }
    }
    return loginLiveData
 }
}

Измененный репозиторий

class LoginRepository {

suspend fun uploadUserDetails(): Task<DocumentReference> = withContext(Dispatchers.IO) {
    val currentUser = FirebaseUtils.getCurrentUser()
    val user = User(currentUser?.displayName, currentUser?.email, currentUser?.photoUrl.toString())

    FirebaseFirestore.getInstance()
        .collection(FirebaseReferences.COLLECTION_USERS)
        .add(user)
 }
}
...