繁体   English   中英

如何在 Compose 中使用密封类正确建模 UI 状态?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM