Запретить Stateflow выдавать предыдущее значение при составлении реактивного ранцаAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Запретить Stateflow выдавать предыдущее значение при составлении реактивного ранца

Сообщение Anonymous »

Это моя составная функция. Когда я использую CollectAsState() для сбора значений пользователей из LoginViewModel, он уведомляет каждый раз, когда значение обновляется. Но проблема в том, что он всегда выдает два значения, иначе одно — предыдущее значение, а другое — последнее. Я хочу, чтобы выдавалось только последнее значение.

Код: Выделить всё

@SuppressLint("FlowOperatorInvokedInComposition")
@Composable
fun LoadUsers(loginViewModel: LoginViewModel, isNetworkAvailable: Boolean) {
val state by loginViewModel.users.collectAsState(initial = AllEvents.Nothing)
val textState = remember { mutableStateOf(TextFieldValue("")) }

LaunchedEffect(isNetworkAvailable) {
if (!isNetworkAvailable) {
loginViewModel.users.emit(AllEvents.StringResource(R.string.noInternet))
} else {
loginViewModel.getUsers()
}
}

when (state) {
is AllEvents.Nothing -> {

}

is AllEvents.Loading -> {
ProgressDialog(showDialog = (state as AllEvents.Loading).loading)
}

is AllEvents.Success -> {
UserActivity((state as AllEvents.Success).data as ArrayList, textState)
ProgressDialog(showDialog = false)
}

else -> {
if (state.asString() != stringResource(id = R.string.noInternet) || !isNetworkAvailable)
Toast.makeText(
LocalContext.current,
state.asString().toString(),
Toast.LENGTH_SHORT
).show()
}
}
}
Это моя модель входа в систему

Код: Выделить всё

class LoginViewModel(
private val apiServiceImpl: ApiServiceImpl
) :
ViewModel() {
val users = MutableStateFlow()

fun getUsers() {
viewModelScope.launch {
users.emit(AllEvents.Loading(true))
apiServiceImpl.getUserList(1).either({
users.emit(AllEvents.DynamicError(it))
it
}) {
users.emit(AllEvents.DynamicError("it"))
it
}
}
}
}
Это getUserList()

Код: Выделить всё

suspend fun getUserList(page: Int): Either {
return try {
Either.Right(apiService.getUsers(page))
} catch (ex: Exception) {
Either.Left(ex.errorMessage() as String)
}
}
AllEvents — это запечатанный класс, который я использую для управления состоянием пользовательского интерфейса приложения. UserActivity и ProgressDialog являются составными компонентами, созданными для отображения пользовательского интерфейса.
Фактическая проблема, с которой я столкнулся, заключается в том, что я показываю всплывающее сообщение при отсутствии подключения к Интернету, а также в том случае, если я получаю результат успеха от API. Теперь, если я получу результат успеха от API, он покажет мне всплывающее сообщение, которое я показал. Когда я отключаю подключение к Интернету, сначала отображается всплывающее сообщение об успехе, а затем отображается отсутствие подключения к Интернету. Это первый сценарий
Второй сценарий
Изначально подключение к Интернету отсутствует и он показывает мне всплывающее сообщение об отсутствии подключения к Интернету, а затем, когда я восстанавливаю подключение к Интернету, он снова показывает мне всплывающее сообщение об отсутствии подключения к Интернету, а также дает мне результат успеха от API. Согласно моим выводам, все это происходит из-за CollectAsState()
Вот ссылка на видео сценария

Подробнее здесь: https://stackoverflow.com/questions/788 ... ck-compose
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»