【发布时间】:2021-10-07 14:34:17
【问题描述】:
所以我一直在探索使用 Kotlin Flows 的 MVI,基本上是 MutableSharedFlow 用于事件,MutableStateFlow 用于状态。但是我在添加逻辑来控制文本更改事件发射时遇到问题,以人类的方式编写它就是这样。
观察文字变化,只搜索最新写的单词 半秒内。
因此,如果用户删除或添加字母,我只会在半秒后搜索最新的单词。
我尝试通过编写以下内容来实现这一点,在这里我订阅了事件
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 中有这样的东西吗?
【问题讨论】:
-
对单个项目的流进行去抖动不会做任何有用的事情,除非可能会导致该项目的延迟(不确定)。
-
是的,我知道,你有解决办法
-
我说得对吗:您想在
SearchClicked事件上立即开始搜索,但对SearchQueryChanged事件进行去抖动,对吗? -
没错,你是对的
标签: android kotlin kotlin-coroutines kotlin-flow