本篇解析 example-flow-25.kt。学习一种极具响应性的嵌套流处理方式。
1. 核心操作符:flatMapLatest
flatMapLatest 与 collectLatest 的设计理念一致:只对最新的发射值感兴趣。
工作原理:
- 切换与取消:每当初始流发射一个新值时,如果上一个子流(由
flatMapLatest产生)还在运行,它会立即取消旧的子流,并开启新的子流。
2. 代码解析
1 | (1..3).asFlow().onEach { delay(100) } // 每 100ms 发射一个数字 |
- 结果分析:
- 100ms:发射 1,启动子流 1 -> 产出
1: First。 - 200ms:发射 2。此时子流 1 还在
delay,立即被取消,启动子流 2 -> 产出2: First。 - 300ms:发射 3。此时子流 2 还在
delay,立即被取消,启动子流 3 -> 产出3: First。 - 800ms:子流 3 终于跑完了 500ms 的
delay-> 产出3: Second。
- 100ms:发射 1,启动子流 1 -> 产出
- 输出:
1: First,2: First,3: First,3: Second。只有最后一个子流完成了。
3. 开发者感悟
flatMapLatest 是处理诸如“即时搜索”的最佳方案。用户每输入一个字,我们就取消上一次的 API 请求流,开始新的请求流。这能保证 UI 始终反映用户的最后一次操作。