DoReMi

[kotlin] ViewModelFactory 본문

Android/개념

[kotlin] ViewModelFactory

도레미누 2024. 1. 26. 18:35

뷰모델 팩토리란?

뷰모델 팩토리는 파라미터가 있는 뷰모델을 객체화 시키는 역할을 한다. 이는 UI-컨트롤러끼리 데이터를 주고받으면서 뷰모델에 어떤 인수를 넣어 초기화하고 싶을 때 뷰모델 팩토리를 이용해 초기화한다.

뷰모델 팩토리를 사용하는 이유

주로 커스텀한 생성 로직을 구현하거나 **의존성 주입(Dependency Injection)**을 쉽게 하기 위함입니다. ViewModelFactory를 사용하면 ViewModel 인스턴스를 생성할 때 특정한 매개변수나 초기화 로직을 적용할 수 있습니다.

적용 코드

View에서 ViewModel 선언 시 
private val viewModel: HomeViewModel by viewModels { ViewModelFactory() }
이런식으로 ViewModelFactory를 가져옴
class HomeViewModel(private val homeRepository: HomeRepository) : ViewModel() {
    private val _homeState = MutableLiveData<HomeState>()
    val homeState = _homeState

    private val _followerList = MutableLiveData<List<ResponseFollowerDto.FollowerData>>()
    val followerList = _followerList

    fun getFollowerList() {
        _homeState.value = HomeState.Loading
        viewModelScope.launch {
            homeRepository.getFollowerList(pageNumber)
                .onSuccess {
                    _followerList.value = it
                    _homeState.value = HomeState.Success
                }.onFailure {
                    _homeState.value = HomeState.Error
                }
        }
    }

    companion object {
        const val pageNumber = 2
    }
}
class ViewModelFactory : ViewModelProvider.Factory {
    override fun <T : ViewModel> create(modelClass: Class<T>): T {
        return when {
            modelClass.isAssignableFrom(HomeViewModel::class.java) -> {
                HomeViewModel(HomeRepository()) as T
            }

            else -> throw IllegalArgumentException("Unknown ViewModel Class")
        }
    }
}
class HomeRepository {
    suspend fun getFollowerList(pageNumber: Int): Result<List<ResponseFollowerDto.FollowerData>> =
        runCatching {
            ServicePool.followerService.getFollowerList(pageNumber).followerData
        }
}

'Android > 개념' 카테고리의 다른 글

[Kotlin] Clean Architecture  (0) 2024.02.08
[kotlin] Dagger Hilt  (0) 2024.01.31
[Kotlin] ListAdatper / DiffUtil  (0) 2024.01.19
[Kotlin] Flow(StateFlow,SharedFlow)  (2) 2023.12.19
[Kotlin] Coil 라이브러리  (0) 2023.11.19