You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Firebase与Paging 3实现搜索时如何动态更新PagingDataSource的Query

实现方案

核心通过可观察的过滤参数驱动分页流动态切换,无需修改原有UI层的观测逻辑:

1. 调整ViewModel代码

首先新增持有过滤参数的可观察状态,同时将原有的分页流改造为过滤状态的派生流:

// 持有当前过滤参数,默认空字符串代表无过滤
private val currentFilter = MutableStateFlow("")

val dataFlow = currentFilter.flatMapLatest { filter ->
    Pager(
        PagingConfig(pageSize = PAGE_SIZE)
    ) {
        val loggedUserUid = authRepository.getLoggedUser()!!.uid
        // 根据当前过滤参数选择对应Query
        val query = if (filter.isEmpty()) {
            dataRepository.getReports()
        } else {
            dataRepository.getReportsQuery(filter)
        }
        FirestorePagingDataSource(query)
    }.flow
}.cachedIn(viewModelScope)

// 暴露给UI层更新过滤参数的方法
fun setFilter(filter: String) {
    currentFilter.value = filter
}

2. 触发过滤操作

需要执行过滤时,直接调用ViewModel的setFilter方法传入目标参数即可,比如用户点击搜索按钮时:

searchButton.setOnClickListener {
    val plateNumber = searchInput.text.toString().trim()
    viewModel.setFilter(plateNumber)
}

如果需要清空过滤回到全量数据,传入空字符串调用该方法即可。

注意事项

你当前的带过滤Query用到了whereEqualTo+orderBy的复合查询,需要提前在Firebase控制台创建对应索引。首次运行触发过滤逻辑时如果缺失索引,Logcat会直接输出一键创建索引的跳转提示,按提示操作即可。

内容的提问来源于stack exchange,提问作者Emek Cohen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 15:36:05