@@ -2,11 +2,13 @@ package com.yapp.ui.base
22
33import androidx.compose.runtime.Composable
44import androidx.compose.runtime.LaunchedEffect
5+ import androidx.compose.runtime.State
56import androidx.compose.runtime.getValue
67import androidx.compose.runtime.rememberUpdatedState
78import androidx.lifecycle.Lifecycle
89import androidx.lifecycle.ViewModel
910import androidx.lifecycle.compose.LocalLifecycleOwner
11+ import androidx.lifecycle.compose.collectAsStateWithLifecycle
1012import androidx.lifecycle.repeatOnLifecycle
1113import androidx.lifecycle.viewModelScope
1214import kotlinx.coroutines.Dispatchers
@@ -23,10 +25,10 @@ abstract class BaseViewModel<S : UiState, I : UiIntent, SE : UiSideEffect>(
2325 initialState : S ,
2426) : ViewModel() {
2527 private val _state = MutableStateFlow (initialState)
26- val state = _state .asStateFlow()
28+ protected val state = _state .asStateFlow()
2729
2830 private val _sideEffect : Channel <SE > = Channel (BUFFERED )
29- val sideEffect = _sideEffect .receiveAsFlow()
31+ protected val sideEffect = _sideEffect .receiveAsFlow()
3032
3133 fun onIntent (intent : I ) =
3234 viewModelScope.launch {
@@ -42,21 +44,28 @@ abstract class BaseViewModel<S : UiState, I : UiIntent, SE : UiSideEffect>(
4244
4345 protected fun postSideEffect (effect : SE ) =
4446 viewModelScope.launch { _sideEffect .send(effect) }
45- }
4647
47- @Composable
48- fun <S : UiState , I : UiIntent , SE : UiSideEffect > BaseViewModel <S , I , SE >.collectSideEffect (
49- sideEffect : (suspend (sideEffect: SE ) -> Unit ),
50- ) {
51- val sideEffectFlow = this .sideEffect
52- val lifecycleOwner = LocalLifecycleOwner .current
48+ @Composable
49+ fun collectAsState (
50+ lifecycleState : Lifecycle .State = Lifecycle .State .STARTED ,
51+ ): State <S > {
52+ return state.collectAsStateWithLifecycle(minActiveState = lifecycleState)
53+ }
54+
55+ @Composable
56+ fun collectSideEffect (
57+ sideEffect : (suspend (sideEffect: SE ) -> Unit ),
58+ ) {
59+ val sideEffectFlow = this .sideEffect
60+ val lifecycleOwner = LocalLifecycleOwner .current
5361
54- val callback by rememberUpdatedState(newValue = sideEffect)
62+ val callback by rememberUpdatedState(newValue = sideEffect)
5563
56- LaunchedEffect (sideEffectFlow, lifecycleOwner) {
57- lifecycleOwner.lifecycle.repeatOnLifecycle(Lifecycle .State .STARTED ) {
58- withContext(Dispatchers .Main .immediate) {
59- sideEffectFlow.collect { callback(it) }
64+ LaunchedEffect (sideEffectFlow, lifecycleOwner) {
65+ lifecycleOwner.lifecycle.repeatOnLifecycle(Lifecycle .State .STARTED ) {
66+ withContext(Dispatchers .Main .immediate) {
67+ sideEffectFlow.collect { callback(it) }
68+ }
6069 }
6170 }
6271 }
0 commit comments