Я создал 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 по представлению, я думаю, что это безопасно сделать, потому что оно удаляет себя, когда представление уничтожается, однако я могу упустить другие последствия этого.