Как обрабатывать события в классе обслуживания внутри viewmodel?Компоненты архитектуры, Kotlin, Firebase) - PullRequest
0 голосов
/ 16 марта 2019

Я ищу способ реагировать на такие события, как onComplete(), onFailure(), ... внутри модели представления.

Например:

Я создал класс с именем EmailSignInService, который вызывает OnCompleteListener из экземпляра firebase в случае входа пользователя в систему.Я хотел бы обработать это событие в viewmodel для обновления пользовательского интерфейса.

EmailSignInService

    fun signInUser(email: String, password: String) {
    auth.signInWithEmailAndPassword(email, password).
        addOnCompleteListener(OnCompleteListener<AuthResult> { task -> {
        if(task.isSuccessful) {
            val currentUser = auth.currentUser;
            // inform somehow viewmodel to change UI state later
        } //...
    } });
}

LoginViewModel

class LoginViewModel : ViewModel() {
var userName: String? = null; //...
var userPassword: String? = null; //...

// Button on click 
fun LoginUser() {
// Create an instance of signin service and get result to inform UI 
}

Можно создать интерфейс и передать его какпараметр для EmailSignInService (обратный вызов), который затем вызывает соответствующий метод внутри addOnCompleteListener.LoginViewModel должен также реализовать интерфейс и поместить логику в соответствующий метод.

Есть ли другой или лучший способ справиться с такой ситуацией?

1 Ответ

2 голосов
/ 16 марта 2019

Вы действительно не хотите обрабатывать события Firebase внутри ViewModel. ViewModel не должен понимать детали реализации вашего источника данных. Предполагается, что вы будете работать с абстракциями об источнике данных, как правило, через объект LiveData, предоставляемый объектом репозитория, который имеет все детали реализации. LiveData может передавать данные из объекта задачи Firebase обратно во ViewModel.

Действительно грубый дизайн (ваш должен быть более надежным и обрабатывать ошибки):

data class UserData {
    // information about the logged in user, copied from FirebaseUser
}

class UserRepository {
    fun newUser(): LiveData<UserData> {
        // Sign in with Firebase Auth, then when the Task is
        // complete, create a UserData using the data from
        // the auth callback, then send it to the LiveData
        // that was returned immediately
    }
}

class LoginViewModel : ViewModel() {
    private val repo = UserRepository()
    fun signInNewUser() {
        val live: LiveData<UserData> = repo.newUser()
        // observe the LiveData here and make changes to views as needed
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...