Код: Выделить всё
LoadingКод: Выделить всё
@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)
}
}
}
Код: Выделить всё
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
Подробнее здесь: https://stackoverflow.com/questions/795 ... ck-compose