Java.lang.IllegalStateException при использовании State в Android Jetpack ComposeAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Java.lang.IllegalStateException при использовании State в Android Jetpack Compose

Сообщение Anonymous »

У меня есть ViewModel с запечатанным классом Kotlin для предоставления различных состояний пользовательского интерфейса. Кроме того, я использую объект androidx.compose.runtime.State для уведомления пользовательского интерфейса об изменениях состояния.
Если возникает ошибка в запросе MyApi, я помещаю UIState. Сбой в объекте MutableState, а затем я получаю IllegalStateException:

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

 java.lang.IllegalStateException: Reading a state that was created after the snapshot was taken or in a snapshot that has not yet been applied
at androidx.compose.runtime.snapshots.SnapshotKt.readError(Snapshot.kt:1524)
at androidx.compose.runtime.snapshots.SnapshotKt.current(Snapshot.kt:1764)
at androidx.compose.runtime.SnapshotMutableStateImpl.setValue(SnapshotState.kt:797)
at com.vladuken.compose.ui.category.CategoryListViewModel$1.invokeSuspend(CategoryListViewModel.kt:39)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:104)
at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:571)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:738)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:678)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:665)
Код ViemModel:

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

@HiltViewModel
class CategoryListViewModel @Inject constructor(
private val api: MyApi
) : ViewModel() {

sealed class UIState {
object Loading : UIState()
data class Success(val categoryList: List) : UIState()
object Error : UIState()
}

val categoryListState: State
get() = _categoryListState
private val _categoryListState =
mutableStateOf(UIState.Loading)

init {
viewModelScope.launch(Dispatchers.IO) {
try {
val categories = api
.getCategory().schemas
.map { it.toDomain() }
_categoryListState.value = UIState.Success(categories)

} catch (e: Exception) {
//this does not work
_categoryListState.value = UIState.Error
}
}
}

}
Я попробовал отложить установку UIState.Error — и это сработало, но я не думаю, что это нормальное решение:

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

viewModelScope.launch(Dispatchers.IO) {
try {
val categories = api
.getCategory().schemas
.map { it.toDomain() }
_categoryListState.value = UIState.Success(categories)

} catch (e: Exception) {
//This works
delay(10)
_categoryListState.value = UIState.Error
}
}
Я наблюдаю объект State в функции Composable следующим образом:

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

@Composable
fun CategoryScreen(
viewModel: CategoryListViewModel,
onCategoryClicked: (Category) -> Unit
) {
when (val uiState = viewModel.categoryListState.value) {
is CategoryListViewModel.UIState.Error -> CategoryError()
is CategoryListViewModel.UIState.Loading -> CategoryLoading()
is CategoryListViewModel.UIState.Success -> CategoryList(
categories = uiState.categoryList,
onCategoryClicked
)
}
}
Версия Compose: 1.0.0-beta03
Как обрабатывать запечатанный класс UIState с состоянием Compose > чтобы он не вызывал IllegalStateException?

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

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

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

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

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

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

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