我有一个登录表单。我使用StateFlow
将LoginResult
(调用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_progress
或loading
或其他任何东西发出时,应用程序通常会显示微调器或其他东西。