所以我一直在使用 Kotlin Flows 探索 MVI,基本上是用于事件的 MutableSharedFlow 和用于状态的 MutableStateFlow。但我在添加逻辑来控制文本更改事件发射时遇到问题,以人类的方式编写它会是这样的。
Observe text changes and only search for the latest word written within half of a second.
因此,如果用户删除或添加字母,我只会在半秒后搜索最新的单词。
我尝试通过编写以下内容来实现此目的,在这里我订阅事件
events.flatMapConcat { it.eventToUsecase() }
.onEach { _states.value = it }
.launchIn(viewModelScope)
我使用此函数将每个事件映射到一个用例:
private fun SearchScreenEvent.eventToUsecase(): Flow<SearchState> {
return when (this) {
is SearchClicked -> searchUsecase(this.query)
is SearchQueryChanged ->
flowOf(this.query)
.debounce(500)
.flatMapConcat { searchUsecase(it) }
}
}
我知道我必须控制事件本身,但如何独立控制 SearchQueryChanged 事件。在 RxJava 中,我使用 Publish
和 switchMap
运算符,Flow 是否有类似的操作。
最佳答案
debounce()
可以采用 lambda 参数来确定每个项目的延迟,所以我认为这会起作用:
events.debounce {
when (it) {
is SearchClicked -> 0L
is SearchQueryChanged -> 500L
}
}
.flatMapConcat { searchUsecase(it.query) }
.onEach { _states.value = it }
.launchIn(viewModelScope)
关于android - debounce() Kotlin Flow 运算符不适用于每个新 Flow 创建,如何解决此问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69483024/