Состояние пользовательского интерфейса не обновляется должным образом после получения данных в JetPack ComposeAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Состояние пользовательского интерфейса не обновляется должным образом после получения данных в JetPack Compose

Сообщение Anonymous »

Я работаю над приложением JetPack Compose, где я получаю данные книги с сервера, используя BooksViewModel . Пользовательский интерфейс должен обновляться на основе состояния (, успех или error ). Тем не менее, пользовательский интерфейс показывает только состояние загрузки и не переходит на успех или ошибку . Даже когда я отключаю Интернет, пользовательский интерфейс не показывает сообщение об ошибке или защитывание.

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

@Composable
internal fun BookScreen(
onBackPressed: () -> Unit,
viewModel: BooksViewModel = koinViewModel()
) {
val uiState by viewModel.booksState.collectAsStateWithLifecycle()
val snackBarHostState = remember { SnackbarHostState() }

BackHandler(onBack = onBackPressed)

Scaffold(
snackbarHost = { SnackbarHost(snackBarHostState) }
) { contentPadding ->
when (uiState) {
is BooksUiState.Error -> {
LaunchedEffect(key1 = uiState) {
snackBarHostState.showSnackbar("Unknown Error")
}
}
is BooksUiState.Loading -> {
LoadingOverlay(isLoading = (uiState as BooksUiState.Loading).isLoading) {}
}
is BooksUiState.Success -> {
BookContent(
books = (uiState as BooksUiState.Success).books,
contentPadding = contentPadding
)
}
}
}
}
Это моя книга viewmodel :

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

class BooksViewModel(private val getBooksUseCase: GetBooksUseCase) : ViewModel() {

val booksState: StateFlow = getBooksFlow()
.stateIn(
scope = viewModelScope,
started = SharingStarted.WhileSubscribed(5000),
initialValue = BooksUiState.Loading(true)
)

private fun getBooksFlow(): Flow = flow {
val result = getBooksUseCase()
result.onSuccess { books ->
// instead of real books object I tested for mockBookList
emit(BooksUiState.Success(books = mockBooksList))
}.onFailure { error ->
emit(BooksUiState.Error(error = error))
}
}.catch { error ->
// Handle any unexpected exception during the flow execution
emit(BooksUiState.Error(error = error))
}.onCompletion {
// Ensure loading is set to false, even if cancelled or an error happens.
emit(BooksUiState.Loading(isLoading = false))
}

val mockBooksList = listOf(
BookApiModel(
id = 1,
title = "Book 1",
price = 100,
currencyCode = "USD",
author = "Vivek"
),
BookApiModel(
id = 2,
title = "Book 2",
price = 100,
currencyCode = "USD",
author = "Vivek"
),
BookApiModel(
id = 3,
title = "Book 3",
price = 100,
currencyCode = "USD",
author = "Vivek"
),
BookApiModel(
id = 4,
title = "Book 4",
price = 100,
currencyCode = "USD",
author = "Vivek"
),
BookApiModel(
id = 5,
title = "Book 5",
price = 100,
currencyCode = "USD",
author = "Vivek"
)
)
}
< /code>
Я проверил, что: < /p>

 API работает нормально. < /li>
 Успех и состояния ошибки должны быть излучены. Успех 
или ошибка и только отображение состояния загрузки? Что может быть не так с моим государственным управлением, и как я могу это исправить?

Подробнее здесь: https://stackoverflow.com/questions/795 ... ck-compose
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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