我陷入困境了。
我有领域数据库。在视图模型中,我以流的形式接收数据。在片段中收集它。
问题是当我想过滤/传递参数到领域查询时 - 没有任何变化。
查看模型代码:
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 文本更改。
提前致谢!
要根据 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 的搜索文本。