I am migrating my Android project to Jetpack Compose. To do so, I emit events with StateFlow
from a separate singleton class from Compose and collect
it in my ViewModel. However, after one event is emitted nothing else is collected from the flow in my ViewModel:
- Emitting from my singleton class:
/**
* Class that emits bottom sheet events (expanded, collapsed, etc.).
*/
@Singleton
class BottomSheetEventProducer {
private val _eventsFlow = MutableStateFlow<SheetEvent>(SheetEvent.Collapsed)
val eventsFlow: Flow<SheetEvent> = _eventsFlow
fun produceEvent(event: String) {
var sheetEvent: SheetEvent = SheetEvent.Collapsed
if (event.contains(SheetEvent.Collapsed.Const().value)) {
sheetEvent = SheetEvent.Collapsed
} else if (event.contains(SheetEvent.Expanded.Const().value)) {
sheetEvent = SheetEvent.Expanded
}
Log.i("BottomSheetEventsSingleton", "produceEvent: $sheetEvent")
_eventsFlow.value = sheetEvent
}
}
- Collecting in the ViewModel:
@HiltViewModel
class FarmViewModel @Inject constructor(
private val bottomSheetEvents: BottomSheetEvents
) : ViewModel() {
init {
viewModelScope.launch {
bottomSheetEvents.eventsFlow
.collect { event ->
Log.i("FarmViewModel", "flow event: $event)")
}
}
}
The Log.i in collect
only shows the initial value, and then nothing after.