5

我有一个登录表单。我StateFlow用来发送LoginResult(调用 API 后)从ViewModelActivity. 在活动中,如果登录失败,我将显示一个错误对话框。
它第一次运行良好,但从我第二次登录失败后,错误对话框将不再显示。我都测试.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
            }
            ...
       }
   }
}
4

2 回答 2

1

对于这种情况,我使用SharedFlow所以我Activity仍然能够收集新值,即使它与最后一个值相同

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

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

另一种可能但不好的解决方案是将我的电流更改data class LoginResult(...)class LoginResult. 然后每个新的实例LoginResult都会不同

于 2021-01-06T08:26:26.897 回答
0

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

in_progress -> error -> in_progress -> error

应用程序通常会在发出in_progressorloading或任何内容时显示微调器或其他内容。

于 2021-03-10T17:17:15.867 回答