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 AMAdam Powell
03/30/2021, 12:12 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.dewildte
03/30/2021, 5:35 PM// 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)
}
dewildte
03/30/2021, 5:42 PMdewildte
03/30/2021, 5:43 PMursus
03/30/2021, 7:46 PMursus
04/05/2021, 4:15 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
blockAdam Powell
04/06/2021, 2:17 PMEffect
functions.dewildte
04/06/2021, 3:20 PMdata class ToDoUIState(
val title: String = "Buy Milk",
val onClick: () -> Unit = {}
)
dewildte
04/06/2021, 3:23 PM// 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()
}
dewildte
04/06/2021, 3:23 PMAdam 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 PMdewildte
04/06/2021, 7:32 PM