请检查以下代码:
sealed interface ResourceV2<out T> {
enum class Status {
SUCCESS,
ERROR,
LOADING
}
data class Success<T>(val data: T, val message: String, val code: Int, val state: Boolean) : ResourceV2<T>
data class Error<T>(val data: T? = null, val message: String, val code: Int, val state: Boolean) : ResourceV2<T>
data class Loading<T>(val state: Boolean) : ResourceV2<T>
}
在视图中访问如下:
Resource.Status.SUCCESS
我觉得不应该使用ENUM,应该有一些其他的方法来做干净的MVVM架构。请建议一个答案,包括我的资源类应该是什么样子,以及我如何在视图中访问它。
OLDER资源类:
data class Resource<out T>(val status: Status, val data: T?, val message: String?, val code: Int, val state: Boolean) {
enum class Status {
SUCCESS,
ERROR,
LOADING
}
companion object {
fun <T> success(data: T, message: String, code: Int, state: Boolean): Resource<T> {
return Resource(Status.SUCCESS, data, message, code, state)
}
fun <T> error(data: T? = null, message: String, code: Int, state: Boolean): Resource<T> {
return Resource(Status.ERROR, data, message, code, state)
}
fun <T> loading(state: Boolean): Resource<T> {
return Resource(Status.LOADING, null, null, NetworkConstant.NetworkValues.DEFAULT_ERROR_CODE, state)
}
}
}
3条答案
按热度按时间hm2xizp91#
这就是Resource类的外观
cl25kdpy2#
在所有情况下都有
state: Boolean
,因此可以在密封类或接口中定义它。我更喜欢使用密封的接口而不是密封的类,除非真的需要一些使用公共属性的最终函数。
Loading
可以在没有泛型类型的情况下定义,因为它没有任何T
属性。这使得它的示例化和使用更简单一些。在
when
语句中使用is
检查来收集这些,如Kotlin文档中关于密封类的演示。在我看来,
Error
有一个data
属性,而Success
有一个message
属性,这似乎有点不寻常,但在您的用例中可能是有意义的。njthzxwz3#
如果不想调用Resource.Status.SUCCESS,请从密封类中删除枚举。
您当前的密封类如下所示
并在观察者中直接访问它们,如下所示-
有关更多详细信息,请执行https://developer.android.com/kotlin/flow/stateflow-and-sharedflow