Android Kotlin/Study

[Android Kotlin] ViewModel에 파라미터 넘기기(ViewModelFactory)

DSeung 2022. 10. 21. 15:10

코틀린에서 ViewModel를 만들 때 아래와 같이 ViewModelProvider를 사용해서 만듭니다.

viewModel =  ViewModelProvider(this)[TodoViewModel::class.java]

하지만 위 같은 형식은 TodoViewModel에 파라미터를 넘기지 못하죠 그럴 땐 아래와 같이

ViewModelFactory를 생성해줍시다.

 

저는 TodoViewModel에 String으로 yyyy-mm-dd 형태의 값을 넘기려 하기에 아래처럼 만들어 줍시다.

class ViewModelFactory(date: String?): ViewModelProvider.Factory {
    private var date: String? = null

    init {
        this.date = date
    }

    override fun <T : ViewModel> create(modelClass: Class<T>): T {
        if(modelClass.isAssignableFrom(TodoViewModel::class.java)){
            return TodoViewModel(date) as T
        }
        throw IllegalArgumentException("뷰모델을 만들 수 없습니다 : IllegalArgumentException")
    }
}

이제 맨 처음 VIewModelProvider 부분을 수정해줍시다.

todoViewModel =  ViewModelProvider(this)[TodoViewModel::class.java]
=>
todoViewModel = ViewModelProvider(this, ViewModelFactory("2022-10-21")).get(TodoViewModel::class.java)

 

이해를 돕기 위해 아래는 제가 만든 TodoVIewModel에 대한 코드입니다.

이제 해당 클래스에서 date 파라미터로 "2022-10-21"을 받을 수 있게 된 것입니다.

class TodoViewModel(date: String?) : ViewModel() {
    val todoList: LiveData<MutableList<TodoDao.TodoHistory>>
    private val todoRepository: TodoRepository = TodoRepository.get()

    init {
        todoList = if (date == null){
            todoRepository.list()
        } else{
            todoRepository.listOnDate(date)
        }
    }
}

 

코드 적용시 자료형이나 ViewModel은 상황에 맞게 수정하면 잘 작동할 것 입니다.

궁금한 점이나 틀린 부분에 대한 질문은 언제나 환영입니다.

반응형