Kotlin Flow使用collect()后无法返回结果问题求助
解决Flow<List>转List的问题
你的代码问题核心在于:如果你的Flow是无限流(或者没有正常终止的流),collect()会一直挂起等待新数据,永远走不到return lines那一步。移除collect()的话,Flow根本没被触发收集,所以列表是空的。
直接用Flow内置的操作符就能简洁解决,不需要手动维护可变列表:
suspend fun getInvoiceLines(invoiceLines: Flow<List<InvoiceLine>>): List<InvoiceLine> { return invoiceLines .flattenConcat() // 把每个List<InvoiceLine>拆成单个元素发射,转成Flow<InvoiceLine> .toList() // 自动收集所有元素直到Flow结束,返回完整列表 }
为什么之前的尝试没成功?
你提到试过toList和flatten,大概率是用法不对:如果直接给Flow<List<InvoiceLine>>调用toList(),得到的是List<List<InvoiceLine>>,不是你要的扁平化列表。必须先通过flattenConcat()(或者flattenMerge,看并发需求)把Flow展平成单个元素的流,再调用toList()才能得到所有InvoiceLine的集合。
要是非要手动收集怎么办?
如果坚持用原来的手动收集方式,必须确保你的Flow是有限流(比如用flowOf()生成、或者上游调用了take(n)、onCompletion()确保流能终止),这样collect()才会执行完毕,走到return lines。但这种写法不如内置操作符简洁安全,不推荐。
内容的提问来源于stack exchange,提问作者Willi
相关产品推荐
相关产品推荐

