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