android - debounce() Kotlin Flow 运算符不适用于每个新 Flow 创建,如何解决此问题?

标签 android kotlin kotlin-coroutines kotlin-flow

所以我一直在使用 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 中,我使用 PublishswitchMap 运算符,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/

相关文章:

android - 在演示者类中测试协程

android - 如何在 Android 上处理电容器中传入的共享内容

android - 设置 chromium depot_tools 时无法运行 fetch android

Android:替换选项卡内的 fragment

android - google-api-v2 中的 Mapview 在 android 中带有圆角

android - 切换到 'Main'协程并将其挂起以将结果发送回 'IO'协程

android - 如何在 Android Studio 中查看已编译的 Jar 文件以进行顶层模拟?

java - 如何在 Kotlin 中访问 "Activity.this"?

android - LifecycleScope.launch 与 onViewCreated 中的协程

kotlin - 等待函数(协程)和订阅 Reactor 有什么区别