当新值与最后一个值相同时,状态流不发出



我有一个登录表单。我使用StateFlowLoginResult(调用API后(从ViewModel发送到Activity。在"活动"中,如果登录失败,我将显示一个错误对话框
它第一次运行良好,但从第二次登录失败开始,错误对话框将不会再次显示。我在StateFlow上测试了.value.emit

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
}
...
}
}
}

在这种情况下,我使用SharedFlow,因此我的Activity仍然能够收集新值,即使它与上一个值相同

private val _loginResult = MutableSharedFlow<LoginResult>()
val loginResult: SharedFlow<LoginResult> = _loginResult
...
_loginResult.emit(LoginResult(error = "Login failed"))

另一个可能的解决方案是将我当前的data class LoginResult(...)更改为class LoginResult,但这并不好。那么LoginResult的每个新实例都会有不同的

这是默认情况。您可以做的是在登录过程中发出一个值,然后再发出结果。这样你就会有一个序列,比如:

in_progress -> error -> in_progress -> error

in_progressloading或其他任何东西发出时,应用程序通常会显示微调器或其他东西。

最新更新