Состояние экрана в Compose

Рейтинг: 0Ответов: 0Опубликовано: 07.08.2025

Каким способом лучше хранить состояние экрана в Compose?

1 - Современный подход к состояниям через sealed класс.

sealed interface RequestDataStatus<out T> : Serializable {
    class Loading<T>() : RequestDataStatus<T>
    class Success<T>(val data: T) : RequestDataStatus<T>
    class Failure<T>(val message: String) : RequestDataStatus<T>
}

@Composable
fun <T> Screen(
    val status : State<RequestDataStatus<T>>
) {
    when (val currentStatus = status.value) {
        is RequestDataStatus.Loading -> LoadingScreen()
        is RequestDataStatus.Success -> SuccessScreen(currentStatus.data)
        is RequestDataStatus.Failure -> FailureScreen(currentStatus.message)
    }
}

2 - Классический подход к состояниям.

enum class RequestStatus {
    LOADING,
    SUCCESS,
    FAILURE
}

data class RequestDataStatus<out T>(
    val status: RequestStatus,
    val message: String = "",
    val data: T? = null
) : Serializable {
    companion object {
        fun <T> loading(): RequestDataStatus<T> = RequestDataStatus(status = RequestStatus.LOADING)
        fun <T> success(data: T): RequestDataStatus<T> = RequestDataStatus(status = RequestStatus.SUCCESS, data = data)
        fun <T> failure(message: String): RequestDataStatus<T> = RequestDataStatus(status = RequestStatus.ERROR, message = message)
    }
}

@Composable
fun <T> Screen(
    val status : State<RequestDataStatus<T>>
) {
    val currentStatus = status.value
    when (currentStatus.status) {
        RequestStatus.LOADING -> LoadingScreen()
        RequestStatus.SUCCESS -> SuccessScreen(currentStatus.data!!)
        RequestStatus.FAILURE -> FailureScreen(currentStatus.message)
    }
}

В классическом:

  • when из за enum тоже не требует default ветки;
  • нет проблем с сериализацией/десериализацией через JSON.

Почему используют первый способ через sealed класс?

Ответы

Ответов пока нет.