Skip to content

Instantly share code, notes, and snippets.

@catalinghita8
Last active July 6, 2021 07:23
Show Gist options
  • Save catalinghita8/65718e1ab1e53469529266823ad44183 to your computer and use it in GitHub Desktop.
Save catalinghita8/65718e1ab1e53469529266823ad44183 to your computer and use it in GitHub Desktop.
abstract class BaseViewModel
<Event : ViewEvent,
UiState : ViewState,
Effect : ViewSideEffect> : ViewModel() {
private val initialState: UiState by lazy { setInitialState() }
abstract fun setInitialState(): UiState
private val _viewState: MutableState<UiState> = mutableStateOf(initialState)
val viewState: State<UiState> = _viewState
private val _event: MutableSharedFlow<Event> = MutableSharedFlow()
private val _effect: Channel<Effect> = Channel()
val effect = _effect.receiveAsFlow()
init {
subscribeToEvents()
}
fun setEvent(event: Event) {
viewModelScope.launch { _event.emit(event) }
}
protected fun setState(reducer: UiState.() -> UiState) {
val newState = viewState.value.reducer()
_viewState.value = newState
}
private fun subscribeToEvents() {
viewModelScope.launch {
_event.collect {
handleEvents(it)
}
}
}
abstract fun handleEvents(event: Event)
protected fun setEffect(builder: () -> Effect) {
val effectValue = builder()
viewModelScope.launch { _effect.send(effectValue) }
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment