For event or effects as they are also called, use MutableSharedFlow and ensure you dispatch their emitt with Dispatchers.Main.immediate. You can create a helper extension function for that.
But the article is right in the sense that, a collector might unsubscribe just within that millisecond timeframe where the event travels from the emitter to the collector. The only way is ensuring the emission and consumption is performed in the current loop.
StateFlow is conflated, you can still model a proper solution around them but be careful with conflation.