Как создать пользовательский класс поставщика viewModel, где я могу избежать приведения viewModel? - PullRequest
0 голосов
/ 01 ноября 2019

Доброе утро;

У меня есть этот пользовательский фабричный класс ViewModel:

class AlreadyHaveAnAccountFragmentViewModelFactory (private val userDataSourceRepository: UserDataSourceRepository) :
ViewModelProvider.NewInstanceFactory() {

override fun <T : ViewModel?> create(modelClass: Class<T>): T {
    return AlreadyHaveAnAccountViewModel(userDataSourceRepository) as T
  }
}

    /**
     * Initializing our ViewModel using a custom Factory design pattern
     */
    alreadyHaveAnAccountViewModel = ViewModelProviders.of(
        this,
        AlreadyHaveAnAccountFragmentViewModelFactory(
            RepositoryFactory.createApiRepository()
        )
    ).get(AlreadyHaveAnAccountViewModel::class.java)

Функция create возвращает AlreadyHaveAnAccountViewModel (userDataSourceRepository) где AlreadyHaveAnAccountViewModel мой класс viewModel. Мне нужно создать собственный класс фабрики viewModel, где я могу передать AlreadyHaveAnAccountViewModel в параметре или способ избежать неприятного приведения в конце.

help

1 Ответ

0 голосов
/ 01 ноября 2019

Я нашел ответ: С помощью этого метода вы можете избежать броска в конце. Таким образом, у вас есть только один ViewModelProvider во всем вашем проекте.

Это будет работать с любым классом, принимающим UserDataSourceRepository в качестве аргумента конструктора, и вызовет NoSuchMethodException, если у класса нет правильного конструктора.

class AlreadyHaveAnAccountFragmentViewModelFactory (private val userDataSourceRepository: UserDataSourceRepository) :
ViewModelProvider.NewInstanceFactory() {

override fun <T : ViewModel?> create(modelClass: Class<T>): T {
    return modelClass.getConstructor(UserDataSourceRepository::class.java).newInstance(userDataSourceRepository) as T
  }
}
...