我创建了一个 ViewGroup,它根据 LiveData 实例的状态更新其内容,但是我不知道在视图中观察 LiveData 实例是否会导致一些问题?
这是我正在使用的代码,它在onDestroyView
被调用时删除了观察者。
@BindingAdapter("stateLive")
fun <T> AsyncLayout.setStateLive(stateLive: LiveData<Resource<T>>?) {
stateLive?.apply {
val observer: Observer<Resource<T>> = Observer { it ->
it?.apply {
if (isLoading) {
state = AsyncLayout.State.LOADING
return@Observer
}
state = if (success()) AsyncLayout.State.SUCCESS else AsyncLayout.State.ERROR
}
}
observeForever(observer)
onDestroyView = {
stateLive.removeObserver(observer)
}
}
}
该视图根据从 LiveData 接收到的状态显示错误、加载或内容视图,在 XML 中我可以像这样使用它:
<com.common.views.AsyncLayout
android:id="@+id/asyncLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:stateLiveData="@{vm.someLiveData}">
//Content view
<TextView> ...
<com.common.views.AsyncLayout>
这样我就可以重用这个已经有动画、加载和错误视图的布局,而无需在活动或片段中复制代码。但是我有一个关于通过视图观察 LiveData 的问题,我认为这样做是安全的,因为当视图被破坏时它会自行移除,但是我可能会错过这样做的其他含义。