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

Kotlin中Realm Flow Collect无法传递查询参数及EditText传参疑问

解决方案:Realm动态过滤查询+EditText文本监听

1. 修复Repository的查询过滤逻辑

你的allBooksAsFlowable方法未使用传入的searchDiaryFilters参数,导致过滤完全不生效。需根据过滤条件修改Realm查询:

fun allBooksAsFlowable(searchDiaryFilters: SearchDiaryFilters? = null): Flow<List<RealmBook>> {
    val query = realm.query<RealmBook>()
    // 加入过滤逻辑,假设SearchDiaryFilters包含searchText字段
    searchDiaryFilters?.searchText?.takeIf { it.isNotEmpty() }?.let { searchText ->
        query.contains("title", searchText, Case.INSENSITIVE) // 替换为你的实体类实际字段,如content等
    }
    return query.sort("created", Sort.DESCENDING).asFlow().map { it.list }
}

2. ViewModel实现动态响应搜索文本变化

原savedBooks是一次性初始化的,无法响应searchDiaryText的变化。需用MutableStateFlow保存搜索文本,通过flatMapLatest动态生成查询Flow:

class StateAppModel : ViewModel() {
    // 用MutableStateFlow存储搜索文本,初始值为空
    private val searchDiaryText = MutableStateFlow("")
    
    // 暴露给Fragment的更新方法
    fun updateSearchText(text: String) {
        searchDiaryText.value = text
    }

    val savedBooks: StateFlow<List<RealmBook>> = searchDiaryText
        .flatMapLatest { text ->
            repository.allBooksAsFlowable(SearchDiaryFilters(text))
        }
        .stateIn(viewModelScope, SharingStarted.Eagerly, emptyList())
}

3. Fragment中监听EditText文本变化并传递给ViewModel

用TextWatcher监听EditText输入变化(传统View场景):

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    
    val searchEditText = view.findViewById<EditText>(R.id.search_edit_text)
    searchEditText.addTextChangedListener(object : TextWatcher {
        override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
        
        override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
            s?.toString()?.let { viewModel.updateSearchText(it) }
        }
        
        override fun afterTextChanged(s: Editable?) {}
    })

    // 数据收集逻辑保持不变
    lifecycleScope.launch {
        viewModel.savedBooks.collect {
            booksAdapter.submitData(it)
        }
    }
}

关键说明

  • flatMapLatest会在搜索文本变化时取消旧的Flow订阅,创建新的查询Flow,避免旧结果干扰。
  • Realm的asFlow()会自动监听数据库变化,无论是数据更新还是搜索文本变更,都会自动发射最新列表。
  • 过滤条件中的字段(如示例中的title)需根据你的RealmBook实体类实际字段调整,也可替换为like等其他查询操作符。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 23:47:37