У меня есть логин, связанный с моим приложением 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 при первом создании приложения. Есть предложения?