Состояние экрана в Compose
Каким способом лучше хранить состояние экрана в 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
класс?
Источник: Stack Overflow на русском