片段/活动的 uiState 类的大小

Size of uiState Class for Fragments / Activities

提问人:citizen_code 提问时间:10/31/2023 更新时间:11/1/2023 访问量:66

问:

问题

我是否正确理解,根据谷歌关于应用程序架构的指南,片段/活动的通常只由一个类描述(见下图)?uiState

对于我来说,作为编程的初学者,它看起来像是数据表示()和屏幕相关事物(例如)之间的组合。NewsUiStateNewItemUiStateisSignedIn

但是在复杂的 UI 上,类必须很容易达到 100 个属性的长度,否则我错过了什么?uiState

enter image description here

mvvm android-viewmodel android-architecture-components

评论

1赞 Gabe Sechan 11/1/2023
将其分解为更小的对象是很常见的。可以有数据类 NewUiState(val stateObject1, val stateObject2),其中 stateObject 1 和 2 也是数据类。这可以任意嵌套。
0赞 citizen_code 11/1/2023
好。但是这使得更新我在 ViewModel 中操作的变得更加困难,对吧?在处理嵌套对象之前,我需要执行类似 ?MutableStafeFlow<UiState>_uiState.update { it.copy (namedParameter = newValue) }_uiState.update { NewUiState(it.stateObject1, it.stateObject2.copy (namedParameter = newValue) }
0赞 Gabe Sechan 11/1/2023
复杂的代码就是复杂的代码。在生活中,你经常可以选择你的复杂性在哪里。
0赞 citizen_code 11/1/2023
没错,但作为初学者,您有时会怀疑这是否是复杂性 - 或者您不是不知道事情是如何正确完成的。

答:

1赞 ΓDΛ 11/1/2023 #1

您可以创建多个 State 。data class

示例用例

sealed class UiState {
    data class Success(val data: Data) : UiState()
    data class Error(val error: Throwable) : UiState()
    object Loading : UiState()
}

如何处理

fun handleUiState(uiState: UiState) {
    when (uiState) {
        is UiState.Success -> displayData(uiState.data)
        is UiState.Error -> displayError(uiState.error)
        UiState.Loading -> displayLoadingIndicator()
    }
}

其他示例

sealed class UiState {
    data class Success(val data: Data) : UiState()
    data class Error(val error: Throwable) : UiState()
    object Loading : UiState()
    data class Validation(val errors: Map<String, String>) : UiState()
    data class Completed(val message: String) : UiState()
    object Init : UiState()
    object Empty : UiState()
}

这里重要的是能够分解与相关屏幕相关的状态。您可以为屏幕上的每个组件编写自己的 uiState。这是很好的做法。 它可以与 .您可以使用单个 或 .Sealed classstateflowsharedflow

评论

0赞 citizen_code 11/1/2023
我想这有助于管理更高级别的 uiState。尽管如此,一旦我进入分支,我就需要将所有与uiState相关的东西传递给,对吗?所以我最终还是会得到一个很大的 uiState 类......?!Success(val data: DatadataData
0赞 ΓDΛ 11/1/2023
您可以将其设置为通用。例如,键入 T。