0

我无法理解如何/何时使用 Kotlin 在 Android 中使用密封类。我已经阅读了文档,但我仍然对它的结构以及如何使用它感到困惑。如果有人可以帮助我理解这一点,那将有很大帮助。

4

1 回答 1

1

密封类允许我们以更灵活的方式表示层次结构。它也更具可读性,可用于更好的状态管理。Sealed 类的子类可以是任何类型,例如:数据类、对象类、任何常规类,甚至是另一个密封类。

这就是我们使用 Kotlin 在 Android 中定义密封类的方式:

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

让我们理解这部分代码:

object Loading : UiState() : 将 this 声明为一个对象,因为在这个阶段我们不需要知道任何其他内容。

数据类 Success(val successMessage: String) : UiState() : 声明为数据类,因为当我们获得成功状态时我们需要消息。

数据类 Error(val error: Throwable?):将其声明为数据类,因为当我们得到错误状态时我们需要 Throwable。

注意我们是如何使用对象加载的:UiState()。我们使用与“加载”对象的返回类型相同的密封类名称。这表示,“Loading”对象属于“UiState”密封类。

成功错误状态也是如此。

然后我们可以像下面这样使用这个密封类:

fun observeUiStates(uiState: UiState) = when(uiState) {
    UiState.Loading -> println("Loading...Please wait.")
    is UiState.Success -> println(uiState.successMessage)
    is UiState.Error -> println(uiState.errorMessage)
}

在上述代码块中,我们将UiState密封类作为参数传递给observeUiStates()方法,然后我们检查应用程序的当前状态时使用,然后我们将相应地处理状态。

为了这个例子,我只是在控制台中打印结果。

密封类,最好使用RxJava在 Android 中使用Model-View-Intent模式。

通过使用它们,我们现在可以观察到状态的变化。

每当应用程序有一个新状态时,这个observeUiStates() 方法只会给我们那个特定的状态。

为了使这个特定示例保持简单,我从main()调用此方法。请看下面的代码:

fun main() {
    observeUiStates(UiState.Loading)
    observeUiStates(UiState.Success("The Ui has returned success state.”))
}

这将在控制台中打印以下内容:

Loading...Please wait.
The Ui has returned success state.
于 2021-08-13T14:41:44.043 回答