使用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
相关产品推荐
相关产品推荐

