Невозможно создать архитектуру MVVM для входа - PullRequest
0 голосов
/ 27 апреля 2020

Я решил создать небольшое приложение, которое использует архитектуру MVVM. Мне нужно создать поток входа в систему. Я использую фрагмент как представление и вот часть его кода:

override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)

    viewModel = ViewModelProvider(this, viewModelFactory).get(LoginViewModel::class.java)

    viewModel.user.observe(viewLifecycleOwner, Observer {
        when (it) {
            Result.Loading -> {
                println("Loading")
            }
            is Result.Success -> {
                println(it.data)
            }
            Result.Error -> {
                println("Error")
            }
        }
    })

    log_in_button.setOnClickListener {
        viewModel.logInUser("Sergei", "12345")
    }

}

Здесь я подписываюсь на обновления пользователя и устанавливаю слушателя кнопки. Вот моя ViewModel:

class LoginViewModel : ViewModel() {

    private val loginRepository = LoginRepository()

    private var login: String = ""
    private var password: String = ""

    fun logInUser(login: String, password: String) {
        loginRepository.fetchUser(login, password)
    }

    val user: LiveData<Result<String>>
        get() = loginRepository.fetchUser(login, password)
            .asLiveData(viewModelScope.coroutineContext)

}

Я сделал это, как я видел в учебном пособии, где автор посоветовал создать метод получения, который будет вызывать пользовательский метод выборки из репозитория. А вот мой класс репозитория:

class LoginRepository {

    fun fetchUser(login: String, password: String) = flow {
        emit(Result.Loading)
        if (login == "Sergei" && password == "12345") {
            emit(Result.Success("Sergei"))
        } else {
            emit(Result.Error)
        }
    }

}

Я не знаю, правильно ли использовать поток здесь, так как у меня нет потока пользователей, но я использую его, поскольку излучаю несколько результатов. Пожалуйста, скажите мне, если это неправильное решение использовать поток здесь.

Итак, и моя проблема в том, что я не понимаю, как обновить пользователя в классе ViewModel после получения данных из метода выборки пользователя Repository, пожалуйста, помогите мне решить эту проблему. Буду признателен за любую помощь, заранее спасибо!

** UPD **

Я изменил свой репозиторий и модель представления следующим образом:

class LoginRepository(private val user: MutableLiveData<Result<User>>) {

    fun fetchUser(login: String, password: String) = run {
        if (login == "Sergei" && password == "12345") {
            user.postValue(Result.Success(User(login, password)))
        }
    }

}

class LoginViewModel : ViewModel() {

    var user: MutableLiveData<Result<User>> = MutableLiveData()

    private val loginRepository = LoginRepository(user)

    fun logInUser(login: String, password: String) {
        loginRepository.fetchUser(login, password)
    }

}

Эта реализация работает правильно, но есть ли моменты для улучшения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...