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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 23:03:54