如何仅在特定条件满足时返回List类型的Kotlin Flow?
解决方案
你想要的是仅当boolean为false时发射列表,不发射emptyList(),同时保持返回Flow<List<Item>>类型,以下是可行的实现方式:
方法1:用filter过滤不符合条件的结果
先通过combine将两个流的结果组合,再过滤掉boolean为true的情况,最后提取出items:
override fun returnFlow(): Flow<List<Item>> { return combine(itemsFlow(), booleanFlow()) { items, boolean -> items to boolean } .filter { (_, boolean) -> !boolean } .map { (items, _) -> items } }
方法2:用filterNotNull简化逻辑
在combine的lambda里,符合条件返回items,不符合返回null,再通过filterNotNull过滤掉null值:
override fun returnFlow(): Flow<List<Item>> { return combine(itemsFlow(), booleanFlow()) { items, boolean -> if (!boolean) items else null } .filterNotNull() }
关于你提到的cancelFlow()和返回Nothing的问题:
cancelFlow()会直接终止整个Flow,一旦调用,后续即使boolean变回false也不会再发射任何值,这不符合“条件恢复后继续发射”的需求,而且终止Flow的操作无法保持Flow<List<Item>>的返回类型。- 返回
Nothing的话,combine的结果会变成Flow<Nothing>,无法向上转型为Flow<List<Item>>,不符合函数的返回类型要求。
另外你写的while逻辑是无效的,combine的lambda每次流有新值时都会执行一次,while在这里只会陷入循环,根本不会改变Flow的发射行为。
内容的提问来源于stack exchange,提问作者Targetbus12
相关产品推荐
相关产品推荐

