Я работаю над приложением JetPack Compose, где я получаю данные книги с сервера, используя BooksViewModel . Пользовательский интерфейс должен обновляться на основе состояния (
, успех или error ). Тем не менее, пользовательский интерфейс показывает только состояние загрузки и не переходит на успех или ошибку . Даже когда я отключаю Интернет, пользовательский интерфейс не показывает сообщение об ошибке или защитывание.
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>
Успех и состояния ошибки должны быть излучены. Успех
или ошибка и только отображение состояния загрузки? Что может быть не так с моим управлением состоянием, и как это исправить?
Я работаю над приложением JetPack Compose, где я получаю данные книги с сервера, используя BooksViewModel . Пользовательский интерфейс должен обновляться на основе состояния ([code]Loading[/code], успех или error ). Тем не менее, пользовательский интерфейс показывает только состояние загрузки и не переходит на успех или ошибку . Даже когда я отключаю Интернет, пользовательский интерфейс не показывает сообщение об ошибке или защитывание.[code]@Composable internal fun BookScreen( onBackPressed: () -> Unit, viewModel: BooksViewModel = koinViewModel() ) {
val uiState by viewModel.booksState.collectAsStateWithLifecycle() val snackBarHostState = remember { SnackbarHostState() }
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> Успех и состояния ошибки должны быть излучены. Успех [/code] или ошибка и только отображение состояния загрузки? Что может быть не так с моим управлением состоянием, и как это исправить?[code] 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 [/code]
Я работаю над приложением JetPack Compose, где я получаю данные книги с сервера, используя BooksViewModel . Пользовательский интерфейс должен обновляться на основе состояния ( Loading , успех или error ). Тем не менее, пользовательский интерфейс...
Я работаю над приложением JetPack Compose, где я получаю данные книги с сервера, используя BooksViewModel . Пользовательский интерфейс должен обновляться на основе состояния ( Loading , успех или error ). Тем не менее, пользовательский интерфейс...
У меня возникла проблема: пользовательский интерфейс списка не обновляется должным образом. Однако данные сохраняются правильно в общих настройках
Пример:
У меня есть ProfileViewModel , где я загружаю профиль пользователя, когда пользователь приземляется на экране. Чтобы достичь этого, я использую Statein , чтобы профиль был извлечен автоматически. /> call logoutapi.logout () .
У меня есть ProfileViewModel , где я загружаю профиль пользователя, когда пользователь приземляется на экране. Чтобы достичь этого, я использую Statein , чтобы профиль был извлечен автоматически. /> call logoutapi.logout () .