4

我创建了一个 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 的问题,我认为这样做是安全的,因为当视图被破坏时它会自行移除,但是我可能会错过这样做的其他含义。

4

0 回答 0