【问题标题】:debounce() Kotlin Flow operator doesn't work with Each new Flow creation, how to resolve this?debounce() Kotlin Flow 运算符不适用于每个新的 Flow 创建,如何解决这个问题?
【发布时间】: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 中,我使用的是 PublishswitchMap 运算符,Flow 中有这样的东西吗?

【问题讨论】:

  • 对单个项目的流进行去抖动不会做任何有用的事情,除非可能会导致该项目的延迟(不确定)。
  • 是的,我知道,你有解决办法
  • 我说得对吗:您想在SearchClicked 事件上立即开始搜索,但对SearchQueryChanged 事件进行去抖动,对吗?
  • 没错,你是对的

标签: android kotlin kotlin-coroutines kotlin-flow


【解决方案1】:

debounce() 可以采用 lambda 参数来确定每个项目的延迟,所以我认为这会起作用:

events.debounce {
    when (it) {
        is SearchClicked -> 0L
        is SearchQueryChanged -> 500L
    }
}
    .flatMapConcat { searchUsecase(it.query) }
    .onEach { _states.value = it }
    .launchIn(viewModelScope)

【讨论】:

    【解决方案2】:

    @Tenfour04 解决方案会起作用,但它显示了一个设计问题,所以我现在必须处理两个地方的流程逻辑,可能更多,所以我在 slack 中发布了同样的问题,有人指导我重新设计我的流程如下:

            merge( searchCurrentQuery(),
                   searchWhileTyping(),
                   updateUiSearchText())
    
                .flatMapMerge { it.toUsecase() }
                .onEach { _states.value = it }
                .launchIn(viewModelScope)
    

    通过分离事件并使用合并将它们添加到流中,现在我可以根据需要控制它们的每个流。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-27
      • 1970-01-01
      • 2015-11-10
      相关资源
      最近更新 更多