Android Quicky: Kotlin의 ViewModelProvider.Factory

소개


  • 이 시리즈는 특정 순서로 진행되지 않으므로 원하는 블로그 게시물을 자유롭게 읽으십시오. 블로그 게시물에 사용할 수 있다고 생각되는 항목을 찾을 때마다 하나를 작성하여 여기에 게시합니다
  • .

    시작하기


  • 이 게시물은 ViewModel이 무엇인지 이해하는 것이 아니라 ViewModelProvider.Factory 인터페이스와 우리가 왜 그것을 사용하는지에 대한 것입니다. 따라서 일반적인 ViewModel 클래스는 다음과 같습니다.

  • class CalfViewModel(private val repository: CalfRepository): ViewModel() {
    
    
    class CalfViewModelFactory(private val repository: CalfRepository): ViewModelProvider.Factory{
        override fun <T:ViewModel> create(modelClass: Class<T>):T{
            if(modelClass.isAssignableFrom(CalfViewModel::class.java)){
                @Suppress("UNCHECKED_CAST")
                return CalfViewModel(repository) as T
            }
            throw IllegalArgumentException("UNKNOWN VIEW MODEL CLASS")
        }
    }
    
    


  • 코드 블록은 Google Code LabHERE의 ViewModel 섹션입니다.

  • 뷰모델이란?


  • 이제 documentation에서 명시한 바와 같이 ViewModel 클래스는 수명 주기를 고려한 방식으로 UI-related data를 저장하고 관리하도록 설계되었습니다. ViewModel 클래스를 사용하면 화면 회전과 같은 구성 변경 후에도 데이터가 유지됩니다. 소위 UI-related data는 사용자가 입력한 데이터, 런타임 중에 생성된 데이터 및 데이터베이스에서 로드된 데이터와 같은 몇 가지 다른 종류의 데이터입니다.

  • ViewModelProvider.Factory


  • 그렇다면 왜 Factory 인터페이스를 사용해야 합니까? ViewModel의 기본 생성자에 일부 매개변수를 전달하고 작동하게 할 수는 없나요? 이에 대한 답은 문서HERE, 상태(NO!
  • )와 같이 You should never manually construct a ViewModel outside of a ViewModelProvider.Factory.입니다.
  • 이 순간에 당신은 아마 이렇게 말할 것입니다. 하지만 Tristan 저는 다음과 같이 ViewModelProvider 클래스로 구성되는 ViewModel을 보았습니다.

  • var viewModel = ViewModelProvider(this)
    
    


  • 이는 You should never manually construct a ViewModel outside of a ViewModelProvider.Factory.에 명시된 문서와 모순되지 않습니까? 실제로 문서에 따르면 HERE, ViewModelProvider(this)는 기본 Factory 인터페이스를 사용하지 않습니다.

  • 커스텀 ViewModelProvider.Factory


  • 이제 우리는 ViewModel이 ViewModelProvider.Factory 외부에서 구성되어서는 안 된다는 것을 알고 있습니다. 우리는 또한 기본 생성자 내부에 속성이 없는 ViewModel이 기본 ViewModelProvider.Factory를 사용한다는 것을 알고 있지만 여러 속성이 있는 생성자를 사용하려는 경우 어떻게 됩니까?
    -정답은 ViewModelProvider.Factory 인터페이스를 구현하는 클래스를 생성하는 것입니다. 이것이 바로 우리가 수행한 작업입니다.

  • class CalfViewModelFactory(private val repository: CalfRepository): ViewModelProvider.Factory
    
    


  • 클래스에서 ViewModelProvider.Factory를 구현하면 다형성을 활용하고 ViewModel을 인스턴스화하는 이 클래스를 사용할 수 있습니다. create() 메서드는 그다지 화려하지 않습니다.

  • override fun <T:ViewModel> create(modelClass: Class<T>):T{
            if(modelClass.isAssignableFrom(CalfViewModel::class.java)){
                @Suppress("UNCHECKED_CAST")
                return CalfViewModel(repository) as T
            }
            throw IllegalArgumentException("UNKNOWN VIEW MODEL CLASS")
        }
    


  • 우리가 해야 할 일은 create() 메서드를 재정의하고 일부 오류 처리를 수행한 다음 ViewModel 클래스의 인스턴스를 반환하는 것입니다
  • .

    ViewModelProvider.Factory는 실제로 무엇을 합니까?


  • Factory 인터페이스를 통해 ViewModel을 사용자 정의할 수 있습니다. 그러나 ViewModel의 범위를 바인딩된 활동 또는 프래그먼트의 현재 수명 주기로 지정하는 것은 실제로 ViewModelProvider입니다.

  • 결론


  • 시간을 내어 제 블로그 게시물을 읽어주셔서 감사합니다. 질문이나 우려 사항이 있는 경우 아래에 의견을 말하거나 에서 저에게 연락하십시오.
  • 좋은 웹페이지 즐겨찾기