[英]How to correctly model UI states with sealed classes in Compose?
假设您有一个显示项目列表的简单屏幕。 我可以像这样定义屏幕的 3 种可能状态:
sealed class State() {
data class Success(val items: List<Item> = listOf()): State()
object Loading: State()
data class Error(val error: String? = null): State()
}
在我的 Compose UI 中,我相应地处理状态:
when(state) {
is State.Success -> {
LazyColumn(...) {...}
}
is State.Error -> {
Text(state.error ?: "")
}
is State.Loading -> {
LoadingBar()
}
}
第一个状态将是State.Loading()
因为我将发起网络请求以获取项目。 当项目到达时,状态变为State.Success()
。
但是,如果之后用户按下应该触发另一个网络请求的按钮呢? 在现有内容之上,我需要再次推送State.Loading
类以在新的网络请求完成时显示加载指示器。
但是这个状态不知道之前的 item 内容,所以 UI 只会显示加载指示器,它不会渲染之前State.Success()
。
我可以通过引入一个名为State.LoadingActionWhileSuccess
的新状态来解决这个问题,但这不是可扩展的。
你会如何处理这样的情况? 添加其他 State 类可以工作,但在某个时间点之后它会变得无法管理。
我对这种方法最大的担忧是,当屏幕复杂度上升时,可能的状态组合会失控。
我可以将状态保存在常规data class
并对其进行变异,但我发现这种方法可能会为并发变异引入非法状态。
也许不允许用户通过禁用按钮等来启动另一个网络呼叫。我见过的大多数应用程序都是这样做的。 执行下拉刷新时,刷新图标始终显示,直到呼叫结束。 这可以防止您拨打其他电话。
再说一次,在不知道您的用例的情况下,我只是提出一般性建议。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.