Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

어플리케이션과 생명주기 동일한 뷰모델 초기 로딩 관련 오류 #3

Open
dlgocks1 opened this issue Oct 31, 2023 · 0 comments
Assignees
Labels
bug Something isn't working

Comments

@dlgocks1
Copy link
Contributor

안녕하세요 동천

저희 TopDestinations라고 정의한 바텀네비 최상단 4개의 화면에 대한 뷰모델은 어플리케이션과 생명주기를 동일하게 가져가고자 다음과 같이 설정했는데요

// 메인화면 뷰 모델들
val homeViewModel: HomeViewModel = viewModel()
val noteViewModel: NoteViewModel = viewModel()

어플리케이션을 실행하면 이런 뷰모델이 바로 생성되어

init {
    getTastingNotes()
}

내부의 초기화 함수를 init을 통해 실행시키는데 이러면 초기 유저가 진입했을 때 JWT를 가지고 있지 않아서 API가 무조건 실패하더라고요. 그래서 초기화 관련된 코드를 한곳에 몰아서 로그인이나 회원가입이 성공했을 때 한번에 부르는 형식으로 바꿨습니다.

// 초기 메인 화면 진입 시 수행해야할 작업을 정의합니다.
val onInit: () -> Unit = {
    homeViewModel.getRecommendWines()
    homeViewModel.getWineTips()
    noteViewModel.getTastingNotes()
}

요런식으로 람다형식으로 정의해놓고

 if(it.destination == HomeDestinations.ROUTE){
        onInit()
}

깨끗하지는 않지만... 이런식으로 전달해서 화면 진입시 초기 API를 부르는 형식으로 바꿨어요. 아마 더 좋은.. 방식이? 있겠지만 일단 이렇게 해 놓은 상태입니다.


참고)

아래와 같이 TopViewModel을 상태로 정의해놓고, 이를 가져다 활용해보고자도 했지만,

HomeViewModel, NoteViewModel, MapViewModel.... 를 모두 상속받는 모듈이 없더라고요. 모두 상속받는 모듈을 만들자니 God Object가 생기는 느낌이고, 해당 뷰모델을 인자로 넘길 때 해당 모듈이 모든 뷰모델 정보를 가지고 있어야해서 사용하지 못했습니당. 이것도 더 좋은 방식이 뭔가 더 있지 않을까 싶네요.

@Composable
fun rememberTopViewModels(): TopViewModels {
    val noteViewModel: NoteViewModel = viewModel()
    val homeViewModel: HomeViewModel = viewModel()

    return remember(Unit) {
        TopViewModels(
            noteViewModel = noteViewModel,
            homeViewModel = homeViewModel
        )
    }
}

@Stable
data class TopViewModels(
    val noteViewModel: NoteViewModel,
    val homeViewModel: HomeViewModel
) {

    fun init() {
        homeViewModel.getRecommendWines()
        homeViewModel.getWineTips()
        noteViewModel.getTastingNotes()
    }
}
@dlgocks1 dlgocks1 added the bug Something isn't working label Oct 31, 2023
@dlgocks1 dlgocks1 self-assigned this Oct 31, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

1 participant