기존 접근법의 문제점 분석

1. ViewModel에서 init 블록 사용

@HiltViewModel
class ForYouViewModel @Inject constructor(
    private val getTopicsUseCase: GetTopicsUseCase,
    private val getNewsUseCase: GetNewsUseCase
) : BaseViewModel<ForYouState, ForYouEvent, ForYouEffect>(
    initialState = ForYouState.initial(),
    reducer = ForYouScreenReducer()
) {
    init {
        // Get data via UseCases
    }
    
    fun onTopicClick(topicId: String) {
        sendEffect(
            effect = ForYouEffect.NavigateToTopic(
                topicId = topicId
            )
        )
    }
}

2. LaunchedEffect 사용

@Composable
fun MyScreen(viewModel: MyViewModel) {
    LaunchedEffect(Unit) {
        viewModel.loadData() // 재구성 시마다 호출될 수 있음
    }
}

해결 방법

⇒ Flow의 확장 함수 onStart + stateIn

onStart

Returns a flow that invokes the given action before this flow starts to be collected.”