Я решил создать небольшое приложение, которое использует архитектуру 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)
}
}
Эта реализация работает правильно, но есть ли моменты для улучшения?