在一种特定情况下未观察到LiveData

问题描述 投票:0回答:1

我的ViewModel中有3个LiveData对象,我正在对其进行转换,问题是观察到2个LiveData而没有观察到,我尝试了不同的解决方案,例如更改ViewModel的初始化方式或方法LiveData已初始化,但没有任何帮助。

class MyClass : ViewModel() {

    init {
        _originallist.value = Instance.getOrignalList()
    }

    val a: LiveData<List<A>> = Transformations.map(_searchText, ::extractA)
    val b: LiveData<List<B>> = Transformations.map(_originallist, ::extractB)
    val c: LiveData<List<C>> = Transformations.map(_originalList, ::extractC)

    fun setSearchText(text: String) {
        _searchText.value = text
    }

    fun extractA(text: String): List<A> {
        val temp = ArrayList<A>()
        list.foreach {
            if (it.contains(text, false) temp . add (it)
        }
        return temp
    }

    fun extractB(list: List<B>): List<B> {
        // do something
    }

    fun extractC(list: List<C>): List<C> {
        // do something
    }
}

如果您注意到LiveData b和c仅被初始化一次,因此我可以在RecyclerView中看到数据,但是对于LiveData A,搜索文本可以根据用户输入进行更改,这是我片段未观察到此实时数据。注意事项:这是我3个viewPager片段的常见ViewModel,在一个片段中观察到LiveData a,在另一个片段中观察到B,在另一个片段中观察到C。最终,我还必须对其他2个片段进行搜索。当我调试片段中的观察者行被跳过时,我想指出的另一件事是,所有三个片段中的代码都是相同的,只是它们观察的是不同的LiveDataTIA

android android-fragments kotlin android-livedata android-livedata-transformations
1个回答
0
投票

问题是:

您的功能extractA in

val a: LiveData<List<A>> = Transformations.map(_searchText, ::extractA)

仅在_searchText的值改变时才执行。

这就是Transformations的工作方式,只要值更改,它们就会应用给定的函数。

© www.soinside.com 2019 - 2024. All rights reserved.