[英]Combine Flow<List> and string in kotlin
嘿,我正在使用 kotlin flow。 我有來自服務器的數據列表的流程。 我想過濾文本,我嘗試了一些代碼,但它給了我問題。 有人可以指導我嗎? 謝謝
探索視圖模型.kt
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) // low debounce because we are just filtering local data
.distinctUntilChanged()
.combine(filteredTopics) { queryText, categoriesList ->
val criteria = queryText.lowercase()
if (criteria.isEmpty()) {
return@combine filteredTopics
} else {
categoriesList.filter { category -> category.title?.lowercase()?.let { criteria.contains(it) } == true }
}
}
}
我有filteredTopics
屬性,其中所有數據都來自服務器, queryText
正在使用來自onQueryTextChange
的serarchview
。 我正在嘗試過濾數據並創建名為filteredCategories
的新屬性以將此值傳遞給適配器。 我正在filteredCategories
中嘗試檢查queryText
是否為空,然后傳遞整個列表,否則僅傳遞過濾器列表,但我不知道這是不是正確的做法。
錯誤
private fun setupFilteredTopic() {
lifecycleScope.launchWhenCreated {
repeatOnLifecycle(Lifecycle.State.CREATED) {
viewModel.filteredCategories.collect { filteredTopicsList ->
consultationAdapter.submitList(filteredTopicsList)
}
}
}
}
有人可以指導我。 謝謝
問題是您為過濾類別返回不同類型的元素
if (criteria.isEmpty()) {
return@combine filteredTopics // type MutableStateFlow<List<ConsultationTopics>>
} else {
categoriesList.filter { category -> category.title?.lowercase()?.let { criteria.contains(it) } == true } // type List<ConsultationTopics>
}
所以你需要對你的代碼做一點改動,通過 return@combine filteredTopics.value 更改return@combine filteredTopics
return@combine filteredTopics.value
:
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) // low debounce because we are just filtering local data
.distinctUntilChanged()
.combine(filteredTopics) { queryText, categoriesList ->
val criteria = queryText.lowercase()
if (criteria.isEmpty()) {
categoriesList
} else {
categoriesList.filter { category -> category.title?.lowercase()?.let { criteria.contains(it) } == true }
}
}
}
這應該修復錯誤
您應該使用categoriesList
而不是filteredTopics
在combine
塊中返回ConsultationTopics
對象列表:
val criteria = queryText.lowercase()
return@combine if (criteria.isEmpty()) {
categoriesList
} else {
categoriesList.filter { category -> category.title?.lowercase()?.let { criteria.contains(it) } == true }
}
或者我們可以省略return@combine
運算符:
val criteria = queryText.lowercase()
if (criteria.isEmpty()) {
categoriesList
} else {
categoriesList.filter { category -> category.title?.lowercase()?.let { criteria.contains(it) } == true }
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.