Kotlin中如何将Flow<List<Flow<List<Path>>>>转为Flow<List<List<Path>>>?
解决Kotlin嵌套Flow转换问题
你需要将嵌套的Flow<List<Flow<List<Path>>>>转换为Flow<List<List<Path>>>,同时保证内层Flow的内容更新能同步反映到外层Flow中,可通过transformLatest结合combine操作符实现:
代码实现
val tabs: MutableStateFlow<List<Path>> = getFlowPaths() // 用户自定义方法 // Path类的方法:Path.contents(glob: String = "*"): Flow<List<Path>> val tabsFlow: Flow<List<List<Path>>> = tabs.transformLatest { paths -> // 处理空路径列表的情况 if (paths.isEmpty()) { emit(emptyList()) return@transformLatest } // 为每个Path获取对应的contents Flow val contentFlows = paths.map { it.contents() } // 合并所有内层Flow,任意一个内层Flow更新时都会触发合并 combine(contentFlows) { contentsArray -> contentsArray.toList() }.collect { combinedContents -> emit(combinedContents) } }
逻辑说明
- transformLatest:当
tabs发出新的路径列表时,自动取消对旧路径列表的订阅,只处理最新的路径集合,避免无效订阅和旧数据干扰。 - combine:将所有路径对应的
contents()Flow合并成一个Flow,只要其中任意一个内层Flow更新内容,就会把所有内层Flow的最新值收集为List<List<Path>>并发射,确保外层Flow能同步响应所有内层内容的变化。
内容的提问来源于stack exchange,提问作者Cyber Avater
相关产品推荐
相关产品推荐

