Flow.onCompletion: добавить финальный блок и когда можно эмитить
При сборе Flow нужно выполнить действие после завершения или отмены и при этом получить причину завершения, для чего используют оператор onCompletion с сигнатурой suspend FlowCollector.(cause: Throwable?) -> Unit; он вызывается всегда после завершения или отмены потока, причину передаёт как параметр action.
onCompletion концептуально эквивалентен finally вокруг collect и может использоваться для печати статуса или выполнения очистки, при этом если cause == null это означает успешное завершение, а отличную от null причину следует трактовать как исключение или отмену, возникшие вверх или вниз по цепочке.
Receiver action — FlowCollector, значит внутри onCompletion можно эмитить дополнительные элементы только при успешном завершении; попытка emit при ошибке или отмене пробросит соответствующее исключение, а подавить ошибку и заменить его эмиссией нужно через catch; применять onCompletion для добавления элементов стоит только когда требуется финальная эмиссия при отсутствии ошибок.
flowOf("a", "b", "c") .onCompletion { emit("Done") } .collect { println(it) } // prints a, b, c, Done
• onCompletion вызывается всегда после завершения или отмены потока.
• emit в onCompletion возможен только при успешном завершении потока.
#Kotlin