Kotlin MongoDB Realm 流收集无法将参数传递给查询

问题描述 投票:0回答:1

我陷入困境了。

我有领域数据库。在视图模型中,我以流的形式接收数据。在片段中收集它。

问题是当我想过滤/传递参数到领域查询时 - 没有任何变化。

查看模型代码:

class StateAppModel : ViewModel() {

val savedBooks: StateFlow<List<RealmBook>> = repository.allBooksAsFlowable(SearchDiaryFilters(searchDiaryText.value))
        .stateIn(viewModelScope, SharingStarted.Eagerly, emptyList())

}

数据库:

    fun allBooksAsFlowable(searchDiaryFilters: SearchDiaryFilters? = null): Flow<List<RealmBook>> {
            
            return realm.query<RealmBook>().sort("created", Sort.DESCENDING).asFlow().map { it.list }
  }

片段:

lifecycleScope.launch {
            viewModel.savedBooks.collect {
             
                booksAdapter.submitData(it)
            }
        }

我不明白如何传递过滤字符串,例如EditText 文本更改。

提前致谢!

android kotlin realm
1个回答
0
投票

要根据 EditText 文本更改将过滤器字符串传递给领域查询,您可以修改 ViewModel 和 Fragment 代码以对这些更改做出反应。你可以这样做:

enter code here

StateAppModel 类:ViewModel() {

private val searchDiaryTextFlow = MutableStateFlow("")

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

fun setSearchDiaryText(searchText: String) {
    searchDiaryTextFlow.value = searchText
}

} 在这个修改后的 ViewModel 代码中,我们引入了一个 searchDiaryTextFlow,它是一个表示搜索文本的 MutableStateFlow。然后,我们使用 flatMapLatest 根据过滤器将搜索文本转换为相应的图书流。每当搜索文本发生变化时,都会触发对存储库的新查询。

片段代码: 类 YourFragment : Fragment() {

private val viewModel: StateAppModel by viewModels()
private lateinit var booksAdapter: YourBooksAdapter

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    // Initialize views and adapter

    val searchEditText: EditText = view.findViewById(R.id.searchEditText)
    searchEditText.addTextChangedListener(object : TextWatcher {
        override fun afterTextChanged(s: Editable?) {
            // Update search text in ViewModel when text changes
            viewModel.setSearchDiaryText(s.toString())
        }

        override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
            // Not used
        }

        override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
            // Not used
        }
    })

    lifecycleScope.launch {
        viewModel.savedBooks.collect {
            // Update adapter with filtered books
            booksAdapter.submitData(it)
        }
    }
}

}

在Fragment代码中,我们看到savedBooks发生了变化,并相应地更新了适配器。我们还监听搜索 EditText 中的更改,并使用 setSearchDiaryText 相应地更新 ViewModel 的搜索文本。

© www.soinside.com 2019 - 2024. All rights reserved.