Cat*_*ita 8 android android-jetpack-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()
}
Run Code Online (Sandbox Code Playgroud)
在我的 Compose UI 中,我相应地处理状态:
when(state) {
is State.Success -> {
LazyColumn(...) {...}
}
is State.Error -> {
Text(state.error ?: "")
}
is State.Loading -> {
LoadingBar()
}
}
Run Code Online (Sandbox Code Playgroud)
第一个状态是State.Loading()我将发起网络请求来获取项目。当物品到达时,状态变为State.Success()。
但是,如果之后用户按下一个应该触发另一个网络请求的按钮怎么办?在现有内容之上,我需要State.Loading在新的网络请求完成时再次推送该类以显示加载指示器。
然而,此状态不知道之前的项目内容,因此 UI 只会显示加载指示器,并且不会渲染之前的内容State.Success()。
我可以通过引入一个名为:的新状态来解决这个问题,State.LoadingActionWhileSuccess但这是不可扩展的。
你会如何对待这种情况?添加其他 State 类可能会起作用,但在某些时候它会变得难以管理。
我对这种方法最大的担忧是,当屏幕复杂性增加时,可能状态的组合会失控。
我可以保持状态为常规状态data class并对其进行变异,但我发现这种方法可能会为并发变异引入非法状态。
And*_*Dev -1
也许通过禁用按钮等方式不允许用户在网络呼叫正在进行时启动另一次网络呼叫。我见过的大多数应用程序都是这样做的。当您执行拉动刷新时,刷新图标将始终显示,直到通话结束。这会阻止您拨打其他电话。
再说一遍,在不知道您的用例的情况下,我只是提出一般性建议。
| 归档时间: |
|
| 查看次数: |
2558 次 |
| 最近记录: |