Skip to content

Commit 9fbf020

Browse files
committed
[NDGL-12] chore: collectAsState 추가 및 collectSideEffect 멤버함수로 변경
1 parent bd223ea commit 9fbf020

1 file changed

Lines changed: 23 additions & 14 deletions

File tree

core/ui/src/main/java/com/yapp/ui/base/BaseViewModel.kt

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@ package com.yapp.ui.base
22

33
import androidx.compose.runtime.Composable
44
import androidx.compose.runtime.LaunchedEffect
5+
import androidx.compose.runtime.State
56
import androidx.compose.runtime.getValue
67
import androidx.compose.runtime.rememberUpdatedState
78
import androidx.lifecycle.Lifecycle
89
import androidx.lifecycle.ViewModel
910
import androidx.lifecycle.compose.LocalLifecycleOwner
11+
import androidx.lifecycle.compose.collectAsStateWithLifecycle
1012
import androidx.lifecycle.repeatOnLifecycle
1113
import androidx.lifecycle.viewModelScope
1214
import 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

Comments
 (0)