问题描述
我有一个登录表单。我使用 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
}
...
}
}
}
解决方法
对于这种情况,我使用 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_progress
或 loading
或其他任何内容时显示微调器或其他内容。