【问题标题】:How to pass MutableLiveData <String> from function to Pager?如何将 MutableLiveData <String> 从函数传递给寻呼机?
【发布时间】:2021-12-27 14:05:55
【问题描述】:

我正在尝试将我的搜索功能与 Paging 3 一起使用。我检查了我的 addQuery() 函数,当我进行搜索时,我的 _repoQuery 值不为空。但是当我尝试将值传递给 Pager {} 时,它始终为空。我知道,因为它总是会显示与默认值(“花”)相对应的书籍列表。有谁知道我在搜索时如何将 _repoQuery 值传递给 Pager {}?

class MainViewModel () : ViewModel() {

    // Queries
    private val _repoQuery = MutableLiveData<String?>()
    private val _filter = MutableLiveData<String?>()
    val reusableQuery = MutableLiveData<String?>()
    private val repo = Repo

    fun addFilter(filter: String?) {
        _filter.value = filter
    }

    fun addQuery(query: String) {
        _repoQuery.value = query // Here _repoQuery.value exists
        reusableQuery.value = _repoQuery.value
    }

    val books: Flow<PagingData<Volume>> = Pager(PagingConfig(pageSize = 40)) {
        BookListSource(repo, bookFilter = _filter.value, query = _repoQuery.value?:"flowers")
    }.flow.cachedIn(viewModelScope) // Here _repoQuery.value is null
}

解决方案

这最终奏效了:

val repoQuery = _repoQuery.switchMap {
        liveData {
            emit(Pager(PagingConfig(pageSize = 40)) {
                BookListSource(repo, bookFilter = _filter.value, query = _repoQuery.value)
            }.flow.cachedIn(viewModelScope))
        }
    } 

我的理解是 liveData 在到达时会发出新的结果...

【问题讨论】:

    标签: android kotlin android-livedata android-paging android-paging-3


    【解决方案1】:

    它为空,因为在创建 Pager 时,您的 filter/query 没有任何值。当您更改这些值时,您需要重新制作Pager,因为您提供的BookListSource 不再有效。这不是世界上最漂亮的东西,但它应该让你开始。

    //Make it once at the start to avoid lateinit 
    var books : Flow<PagingData<Volume>> = Pager(PagingConfig(pageSize = 40)) {
              BookListSource(repo, bookFilter = _filter.value, query = _repoQuery.value?:"flowers")
         }.flow.cachedIn(viewModelScope) 
    
    fun addFilter(filter: String?) {
        _filter.value = filter
        //filter changes so the BookListSource needs to be different
        books = Pager(PagingConfig(pageSize = 40)) {
             BookListSource(repo, bookFilter = _filter.value, query = _repoQuery.value?:"flowers")
        }.flow.cachedIn(viewModelScope) 
    }
    
    fun addQuery(query: String) {
        _repoQuery.value = query // Here _repoQuery.value exists
        reusableQuery.value = _repoQuery.value
        //query changes so the BookListSource needs to be different
        books = Pager(PagingConfig(pageSize = 40)) {
             BookListSource(repo, bookFilter = _filter.value, query = _repoQuery.value?:"flowers")
        }.flow.cachedIn(viewModelScope) 
    }
    

    【讨论】:

    • 感谢您的帮助!这不起作用,但将代码包装在 liveData 中就可以了。
    • 嘿@avalerio 你能看看这个issue
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    • 2020-09-26
    • 1970-01-01
    • 2022-11-18
    • 2016-06-07
    相关资源
    最近更新 更多