Skip to content

Instantly share code, notes, and snippets.

View linean's full-sized avatar

Maciej Sady linean

View GitHub Profile
sealed class Event {
object Increment : Event()
object Decrement : Event()
}
data class State(
val counter: Int = 0
)
class ViewModel {
class ViewModel {
private val events = Channel<Event>()
val state = MutableStateFlow(State())
init {
events.receiveAsFlow()
.onEach(::updateState)
.launchIn(viewModelScope)
class ViewModel {
private val events = Channel<Event>()
val state = events.receiveAsFlow()
.runningFold(State(), ::reduceState)
.stateIn(viewModelScope, Eagerly, State())
fun handleEvent(event: Event) {
events.trySend(event)
interface StateReducerFlow<STATE, EVENT> : StateFlow<STATE> {
fun handleEvent(event: EVENT)
}
private class StateReducerFlowImpl<STATE, EVENT>(
initialState: STATE,
reduceState: (STATE, EVENT) -> STATE,
scope: CoroutineScope
) : StateReducerFlow<STATE, EVENT> {
private val events = Channel<EVENT>()
private val stateFlow = events
.receiveAsFlow()
fun <STATE, EVENT> ViewModel.StateReducerFlow(
initialState: STATE,
reduceState: (STATE, EVENT) -> STATE,
): StateReducerFlow<STATE, EVENT> = StateReducerFlowImpl(initialState, reduceState, viewModelScope)
class ViewModel {
val state = StateReducerFlow(
initialState = State(),
reduceState = ::reduceState
)
private fun reduceState(currentState: State, event: Event): State {
return when (event) {
is Increment -> currentState.copy(counter = currentState.counter + 1)
class ExampleActivity : Activity() {
private val viewModel = ViewModel()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
viewModel.state.handleEvent(ExampleEvent)
}
}
@Composable
fun <ITEM, KEY> AnimatedVerticalGrid(
items: List<ITEM>,
itemKey: (ITEM) -> KEY,
columns: Int,
rows: Int
)
val itemSize = remember(columns, rows) {
val itemWidth = (maxWidth) / rows
val itemHeight = (maxHeight) / columns
DpSize(itemWidth, itemHeight)
}