StateFlow не испускает, когда новое значение совпадает с последним значением

У меня есть форма входа. Я использую для отправки LoginResult (после вызова API) из ViewModel к Activity. В Activity я покажу диалоговое окно с ошибкой, если логин не удался.
Он работает хорошо в первый раз, но после второго раза неудачного входа в систему диалоговое окно с ошибкой больше не будет отображаться. Я тестировал оба .value и .emit на StateFlow

      private val _loginResult = MutableStateFlow(LoginResult())
val loginResult: StateFlow<LoginResult> = _loginResult

fun login(email: String, password: String) {
    viewModelScope.launch {
        when (val result = loginRepository.login(email, password)) {
            is Result.Fail-> {
                _loginResult.value = LoginResult(error = "Login failed")
                // _loginResult.emit(LoginResult(error = "Login failed")) same issue
            }
            ...
       }
   }
}

2 ответа

For this case, I use SharedFlow so my Activity still able to collect the new value even it same the last value

      private val _loginResult = MutableSharedFlow<LoginResult>()
val loginResult: SharedFlow<LoginResult> = _loginResult

...
_loginResult.emit(LoginResult(error = "Login failed"))

Another possible solution but it's not good is change my current data class LoginResult(...) to class LoginResult. Then every new instance of LoginResult will different

That's by default. What you could do is to emit one value when the login is in progress, before emitting the result. That way you would have a sequence like:

in_progress -> error -> in_progress -> error

Apps usually display a spinner or something when the in_progress or loading or whatever is emitted.

Другие вопросы по тегам