微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当新值与最后一个值相同时,StateFlow 不发出

如何解决当新值与最后一个值相同时,StateFlow 不发出

我有一个登录表单。我使用 StateFlowLoginResult调用 API 后)从 viewmodel 发送到 Activity。在Activity中,如果登录失败,我会显示一个错误对话框。
第一次运行良好,但从第二次登录失败后,错误对话框将不再显示。我在 .value

上测试了 .emitStateFlow
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 或其他任何内容时显示微调器或其他内容。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。