커스텀 ViewModel/AndroidViewModel 팩토리 생성을 위한 ViewModelProvider.Factory 인터페이스 구현

ViewModelProvider.NewInstanceFactory(ViewModel용) 또는 ViewModelProvider.AndroidViewModel(AndroidViewModel용)을 확장할 필요가 없습니다.

이 기사는 원래 2021년 10월 30일 vtsen.hashnode.dev에 게시되었습니다.

이전 게시물인 Recommended Ways To Create ViewModel or AndroidViewModel 에서 ViewModel 를 생성하려면 ViewModelProvider.NewInstanceFactory() 를 확장하는 팩토리를 생성해야 하고 AndroidViewModel 를 생성하려면 ViewModelProvider.AndroidViewModelFactory() 를 확장해야 한다고 언급했습니다.

글쎄, 그것은 작동하지만 불필요합니다. 둘 다에 대해 ViewModelPrvoider.Factory 인터페이스를 직접 구현할 수 있습니다.

ViewModelProvider.NewInstanceFactory()




class MyViewModelFactory(private val repository: Repository)
    : ViewModelProvider.NewInstanceFactory() {

    override fun <T : ViewModel?> create(modelClass: Class<T>): T {

        if (modelClass.isAssignableFrom(MyViewModel::class.java)) {
            return MyViewModel(repository) as T
        }

        throw IllegalArgumentException("Unknown ViewModel class")
    }
}


ViewModelProvider.Factory로 대체 가능




class MyViewModelFactory(private val repository: Repository)
    : ViewModelProvider.Factory {

    override fun <T : ViewModel?> create(modelClass: Class<T>): T {

        if (modelClass.isAssignableFrom(MyViewModel::class.java)) {
            return MyViewModel(repository) as T
        }

        throw IllegalArgumentException("Unknown ViewModel class")
    }
}


ViewModelProvider.AndroidViewModelFactory(앱)




class MyAndroidViewModelFactory(
    private val app: Application,
    private val repository: Repository)
    : ViewModelProvider.AndroidViewModelFactory(app) {

    override fun <T : ViewModel?> create(modelClass: Class<T>): T {

        if (modelClass.isAssignableFrom(
                MyAndroidViewModel::class.java)) {

            return MyAndroidViewModel(app, repository) as T
        }

        throw IllegalArgumentException("Unknown ViewModel class")
    }
}


ViewModelProvider.Factory로 대체 가능




class MyAndroidViewModelFactory(
    private val app: Application,
    private val repository: Repository)
    : ViewModelProvider.Factory {

    override fun <T : ViewModel?> create(modelClass: Class<T>): T {

        if (modelClass.isAssignableFrom(
                MyAndroidViewModel::class.java)) {

            return MyAndroidViewModel(app, repository) as T
        }

        throw IllegalArgumentException("Unknown ViewModel class")
    }
}

ViewModelProvider.NewInstanceFactory()ViewModelProvider.AndroidViewModelFactory() 모두 ViewModelPrvoider.Factory 인터페이스를 구현하므로 ViewModelPrvoider.Factory 인터페이스를 직접 구현하여 다른 생성자 매개 변수를 사용하는 사용자 지정 ViewModel/AndroidViewModel 팩토리를 만들 수 있습니다. 여기에는 추가 레이어가 필요하지 않습니다.



그건 그렇고, 이것은 생성자 종속성 주입이라고도 하는 사용자 정의ViewModel를 생성하기 위해 팩토리를 사용하는 대신 Hilt 종속성 주입을 사용하는 것이 또 다른 더 나은 접근 방식임을 제안하는 매체에서 얻은 피드백입니다.

나는 개인적으로 아직 Hilt를 사용하지 않았으며 확실히 배우고 블로그에 올릴 것입니다.

또한보십시오


  • Android Development Tips and Tricks
  • 좋은 웹페이지 즐겨찾기