我有一個StateFlow包含一個簡單的字串串列。我希望能夠過濾該字串串列。每當過濾器更新時,我都想向 StateFlow 推送新的更新。
class ResultsViewModel(
private val api: API
) : ViewModel() {
var filter: String = ""
val results: StateFlow<List<String>> = api.resultFlow()
.stateIn(viewModelScope, SharingStarted.Eagerly, emptyList())
}
粘貼 a 很map容易api.resultFlow():
val results: StateFlow<List<String>> = api.resultFlow()
.map { result ->
val filtered = mutableListOf<String>()
for (r in result) {
if (r.contains(filter)) {
filtered.add(r)
}
}
filtered
}
.stateIn(viewModelScope, SharingStarted.Eagerly, emptyList())
但是如何讓流程在filter更改時實際發出更新?現在,這僅適用于filter設定的初始值。
uj5u.com熱心網友回復:
您可以讓過濾器更新另一個與另一個相結合的 StateFlow。順便說一句,有一個filter功能比手動創建另一個串列并迭代以獲得結果更容易使用。
class ResultsViewModel(
private val api: API
) : ViewModel() {
private val filterFlow = MutableStateFlow("")
var filter: String
get() = filterFlow.value
set(value) {
filterFlow.value = value
}
val results: StateFlow<List<String>> =
api.resultFlow()
.combine(filterFlow) { list, filter ->
list.filter { it.contains(filter) }
}
.stateIn(viewModelScope, SharingStarted.Eagerly, emptyList())
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/479647.html
