如何使用 Kotlin 在 Android 中使用密封的 类?

How to use sealed classes in Android using Kotlin?

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

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

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

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

让我们来理解这部分代码:

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

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

data class Error(val error: Throwable?) : 将此声明为数据 class,因为我们在获得错误状态时需要 Throwable .

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

成功错误状态也是如此。

然后我们可以使用这个密封的 class 如下:

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 sealed class 作为参数传递给 observeUiStates() 方法然后通过使用 when 我们正在检查哪个是应用程序的当前状态,然后我们将相应地处理这些状态。

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

密封 classes,最好使用 RxJava[=62= 在 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.