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