5

ログインフォームがあります。私は(APIを呼び出した後)からにStateFlow送信するために使用します。アクティビティでは、ログインに失敗した場合にエラー ダイアログを表示します。 最初はうまくいきますが、ログインに失敗した 2 回目から、エラー ダイアログが再び表示されなくなります。私は両方をテストしましたLoginResultViewModelActivity
.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

それはデフォルトです。あなたができることは、結果を発行する前に、ログインの進行中に1つの値を発行することです。そうすれば、次のようなシーケンスになります。

in_progress -> error -> in_progress -> error

アプリは通常、 または が発行されたときにスピナーまたは何かを表示しin_progressますloading

于 2021-03-10T17:17:15.867 に答える