dewildte
03/29/2021, 11:15 PMViewModel
collect from a Flow<T>
given to it by a View
, Activity
or Fragment
?
I.E.
// MyView.kt
val events: Flow<Event> = flowOf(Event1, Event2)
viewModel.handleEvents(events)
Adam Powell
03/30/2021, 12:11 AMursus
03/30/2021, 4:09 AMHitender Pannu
03/30/2021, 10:33 AMdewildte
03/30/2021, 5:25 PM// MyViewController.kt
val _events = MutableSharedFlow<Event>()
val events: SharedFlow<Event> = _events.asSharedFlow()
...
viewModel.handleEvents(events)
I thought it was totally wrong due to the aforementioned problems.
That said I was curious if my intuition was wrong, hence I asked my question.// ToDoUIState.kt
data class ToDoUIState(
val title: String = "",
...
)
// ToDoUIEvent.kt
sealed class ToDoUIEvent {
object CompletedToggle : ToDoUIEvent()
}
// EventHandler.kt
fun interface EventHandler<EVENT> {
fun handleEvent(event: EVENT)
}
// ToDoUI.kt
@Composable
fun ToDoUI(stateFlow: Flow<ToDoUIState> = emptyFlow(), eventHandler: EventHandler<ToDoUIEvent>? = null) {
val state = stateFlow.collectAsState(initialState = ToDoUIState())
...
eventHandler?.handleEvent(ToDoUIEvent.CompletedToggle)
}
ursus
03/30/2021, 7:46 PMdewildte
04/06/2021, 2:06 PMAdam Powell
04/06/2021, 2:17 PM@Composable
function: eventHandler?.handleEvent(ToDoUIEvent.CompletedToggle)
unless it's inside an Effect
blockEffect
functions.dewildte
04/06/2021, 3:20 PMdata class ToDoUIState(
val title: String = "Buy Milk",
val onClick: () -> Unit = {}
)
// ToDoUIState.kt
data class ToDoUIState(
val title: String = "Buy Milk",
val onClick: () -> Unit,
...
)
// ToDoUI.kt
@Composable
fun ToDoUI(stateFlow: StateFlow<ToDoUIState>) {
val state = stateFlow.collectAsState()
...
state.onClick()
}
Adam Powell
04/06/2021, 3:53 PMonClick
as opposed to something like an actual callback handler, e.g. Button(onClick = { state.onClick() })
dewildte
04/06/2021, 7:32 PM