Состояние пользовательского интерфейса не обновляется должным образом после получения данных в 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 ->
Log.e("BookScreen", "BookScreen: $uiState")
when (uiState) {
is BooksUiState.Error -> {
LaunchedEffect(key1 = uiState) {
Log.e("BookScreen", "BookScreen: Error")
snackBarHostState.showSnackbar("Unknown Error")
}
}

is BooksUiState.Loading -> {
Log.e("BookScreen", "BookScreen: Loading")
LoadingOverlay(isLoading = (uiState as BooksUiState.Loading).isLoading) {}
}

is BooksUiState.Success -> {
Log.e("BookScreen", "BookScreen: Success")
BookContent(
books = (uiState as BooksUiState.Success).books,
contentPadding = contentPadding
)
}
}
}
}

@Composable
private fun BookContent(
books: List,
contentPadding: PaddingValues,
) {
LazyColumn(
modifier = Modifier
.fillMaxSize()
.padding(horizontal = 16.dp, vertical = 16.dp)
.consumeWindowInsets(contentPadding)
.imePadding(),
contentPadding = contentPadding
) {
items(items = books, key = { it.id }) { book ->
Text(text = book.title, color = Color.White)
}
}
}
Это моя книга 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 ->
Log.e("BooksViewModel", "getBooksFlow: $books")
emit(BooksUiState.Success(books = books))
}.onFailure { error ->
Log.e("BooksViewModel", "getBooksFlow: $error")
emit(BooksUiState.Error(error = error))
}
}.catch { error ->
Log.e("BooksViewModel", "getBooksFlow: $error")
// Handle any unexpected exception during the flow execution
emit(BooksUiState.Error(error = error))
}.onCompletion {
Log.e("BooksViewModel", "getBooksFlow: onCompletion")
// Ensure loading is set to false, even if cancelled or an error happens.
emit(BooksUiState.Loading(isLoading = false))
}

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

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

  2025-03-12 13:30:49.882 14615-14615 BookScreen              com.vivek.bookapp                  E  BookScreen: Loading(isLoading=true)
2025-03-12 13:30:49.882 14615-14615 BookScreen              com.vivek.bookapp                  E  BookScreen: Loading
2025-03-12 13:30:54.081 14615-14615 BooksViewModel          com.vivek.bookapp                  E  getBooksFlow: [BookApiModel(id=100, title=Code Complete: A Practical Handbook of Software Construction, price=2954, currencyCode=EUR, author=Mike Riley), BookApiModel(id=200, title=The Pragmatic Programmer, price=3488, currencyCode=EUR, author=Andrew Hunt and Dave Thomas), BookApiModel(id=300, title=iOS Forensic Analysis, price=4604, currencyCode=EUR, author=Sean Morrisey), BookApiModel(id=400, title=Ghost in the Wires: My Adventures as the World's Most Wanted Hacker, price=1493, currencyCode=EUR, author=Kevin Mitnick), BookApiModel(id=500, title=Handling Unexpected Errors, price=1399, currencyCode=GBP, author=Charles R. Ash), BookApiModel(id=600, title=Android Application Development For Dummies, price=1979, currencyCode=USD, author=Donn Felker)]
2025-03-12 13:30:54.082 14615-14615 BooksViewModel          com.vivek.bookapp                  E  getBooksFlow: onCompletion
2025-03-12 13:30:54.088 14615-14615 BookScreen              com.vivek.bookapp                  E  BookScreen: Loading(isLoading=false)
2025-03-12 13:30:54.088 14615-14615 BookScreen              com.vivek.bookapp                  E  BookScreen: Loading
< /code>
< /li>
  Когда API не удается < /p>
  2025-03-12 13:39:04.844 15004-15004 BookScreen              com.vivek.bookapp                  E  BookScreen: Loading(isLoading=true)
2025-03-12 13:39:04.844 15004-15004 BookScreen              com.vivek.bookapp                  E  BookScreen: Loading
2025-03-12 13:39:04.938 15004-15004 BooksViewModel          com.vivek.bookapp                  E  getBooksFlow: java.net.UnknownHostException: Unable to resolve host "tpbookserver.herokuapp.com": No address associated with hostname
2025-03-12 13:39:04.939 15004-15004 BooksViewModel          com.vivek.bookapp                  E  getBooksFlow: onCompletion
2025-03-12 13:39:04.952 15004-15004 BookScreen              com.vivek.bookapp                  E  BookScreen: Loading(isLoading=false)
2025-03-12 13:39:04.952 15004-15004 BookScreen              com.vivek.bookapp                  E  BookScreen: Loading
[/list]

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

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

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

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

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

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

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