Kotlin中组合Flow<List>与字符串实现列表搜索过滤的问题求助
Kotlin Flow 实现本地搜索过滤报错修复
核心问题点
- 类型不匹配错误:
combine转换块的空查询分支中,返回的是filteredTopics这个MutableStateFlow对象本身,而非它持有的列表数据,和else分支返回的List<ConsultationTopics>类型不一致,导致filteredCategories的实际类型被推导为Flow<Any>,收集时传给submitList的对象类型不符合要求,触发类型异常。 - 搜索逻辑写反:当前判断逻辑是
搜索词.contains(分类标题),和正常搜索需要的「分类标题包含搜索词」逻辑完全相反,即使类型修复后也无法得到正确的搜索结果。 - 冗余取值问题:空分支不需要重新从
filteredTopics取value,combine已经把最新的列表值作为categoriesList参数传进来了,直接用这个参数即可,避免出现取值时序问题。
修复后代码
ExploreViewModel 修正
class ExploreViewModel : BaseViewModel() { private val query = MutableStateFlow("") var queryText: String get() = query.value set(value) { query.value = value } val filteredTopics = MutableStateFlow<List<ConsultationTopics>>(emptyList()) val filteredCategories = query .debounce(200) .distinctUntilChanged() .combine(filteredTopics) { queryText, categoriesList -> val criteria = queryText.trim().lowercase() if (criteria.isEmpty()) { return@combine categoriesList } categoriesList.filter { category -> val lowerCaseTitle = category.title?.lowercase() ?: return@filter false lowerCaseTitle.contains(criteria) } } }
页面收集代码说明
你写的setupFilteredTopic收集逻辑本身没有问题,ViewModel层类型修复后,filteredCategories会正确发射List<ConsultationTopics>类型的数据,consultationAdapter.submitList可以正常接收更新。
注意:服务端拉取到全量列表后,直接给
filteredTopics.value赋值即可,combine会自动感知数据变化,结合当前搜索关键词重新计算过滤结果,不需要额外手动触发过滤逻辑。
内容的提问来源于stack exchange,提问作者user18958467
相关产品推荐
相关产品推荐

