簡體   English   中英

合流<List>和 kotlin 中的字符串

[英]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正在使用來自onQueryTextChangeserarchview 我正在嘗試過濾數據並創建名為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而不是filteredTopicscombine塊中返回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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM