Kotlin中如何将Flow<List<Flow<T>>>转换为Flow<List<T>>
解决方案
你可以组合使用flatMapLatest和combine操作符实现需求,最终代码如下:
getIndexesOfDay(todayDay) .flatMapLatest { indexes -> if (indexes.isNullOrEmpty()) { flowOf(emptyList()) } else { combine( flows = indexes.map { mIndex -> getDetailsByIndex(mIndex) } ) { arrayOfDetails -> arrayOfDetails.toList() } } }
实现说明
- 用
flatMapLatest替换你原本使用的map操作符:当索引列表发生变更时,flatMapLatest会自动取消对旧索引对应的详情流的监听,转而监听新索引对应的详情流,保证索引列表的变更可以向下传播。 - 用
combine操作符把多个Flow<Details>合并为单个Flow<List<Details>>:只要任意一个详情流发射了新的Details对象,combine就会把所有详情流的最新值整合为列表向下发射,满足详情变更触发最终流更新的要求。
内容的提问来源于stack exchange,提问作者Geraldo Neto
相关产品推荐
相关产品推荐

