与Android体系结构组件一起使用Firestore的错误



我有一个活动,可以在其中登录用户。用户登录后,将用户详细信息上传到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。

我不知道我在这里缺少什么。任何帮助将不胜感激。谢谢。

如评论中所建议的,我更改了代码等待结果如下所示,现在我得到了适当的响应:

更改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)
 }
}

相关内容

最新更新