如何解决如何以正确的方式处理Android开发中的视图状态
目前,我已经在我的应用中采用了这种方法:
ViewState (每个屏幕一个viewState)
sealed class CategoriesViewState {
object Loading : CategoriesViewState()
data class Error(
val errorMessage: String,val messageType: UIComponentType
) : CategoriesViewState()
data class CategoryList(
val categories: List<Category>
) : CategoriesViewState()
}
我使用实时数据在片段/活动中观察到这种状态:
viewModel.viewState.observe(viewLifecycleOwner,Observer {
when (it) {
is CategoriesViewState.Loading -> {
progress_bar.visibility = View.VISIBLE
Log.d(TAG,"LOADING")
}
is CategoriesViewState.Error -> {
progress_bar.visibility = View.GONE
Log.d(TAG,"ERROR")
}
is CategoriesViewState.CategoryList -> {
progress_bar.visibility = View.GONE
Log.d(TAG,"DATA")
}
}
})
它工作正常。
但在我看来,随着应用的增长,效率低下。
假设我的应用程序中有20个屏幕:我需要20个viewState,每个屏幕中的when语句都需要编写相同的状态,我需要在每个屏幕中都编写此丑陋的Visible / Gone(更不用说我需要在每个通话中设置“加载状态”
也许我完全错了,这是常见的做法,但是对我来说,似乎很多代码重复。
我没有具体的问题,我只是想知道这是否是Android开发中的常用方法,如果不是,我的代码在做什么错了?
解决方法
关于不同活动的状态,不需要每次创建新屏幕时都进行设置。您可以按照以下方法进行相应修改:
for infile in glob.glob(os.path.join(path,'*.*')):
print('current file is: ' + infile)
with open(infile) as infile:
for line in infile:
for i in range(len(line))
print(line.split()[i])
因此,现在您的sealed class UIState<out T> where T : Any? {
object Loading : UIState<Nothing>()
data class Success<T>(val data: T) : UIState<T>()
data class Failure(val errorMessage: String,val messageType: UIComponentType) : UIState<Nothing>()
}
可以表示为CategoriesViewState
。
我还创建了一些扩展功能以使观察起来更容易:
UiState<List<Category>>
在观察实时数据的方法中:
infix fun <T> UIState<T>.takeIfSuccess(onSuccess: UIState.Success<T>.() -> Unit): UIState<T> {
return when (this) {
is UIState.Success -> {
onSuccess(this)
this
}
else -> {
this
}
}
}
infix fun <T> UIState<T>.takeIfError(onError: UIState.Failure.() -> Unit): UIState<T> {
return when (this) {
is UIState.Failure -> {
onError(this)
this
}
else -> {
this
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。