Есть ли способ передать моему настраиваемому AndroidViewModel
конструктору дополнительный аргумент, кроме контекста приложения. Пример:
public class MyViewModel extends AndroidViewModel {
private final LiveData<List<MyObject>> myObjectList;
private AppDatabase appDatabase;
public MyViewModel(Application application, String param) {
super(application);
appDatabase = AppDatabase.getDatabase(this.getApplication());
myObjectList = appDatabase.myOjectModel().getMyObjectByParam(param);
}
}
И когда я хочу использовать свой собственный ViewModel
класс, я использую этот код в своем фрагменте:
MyViewModel myViewModel = ViewModelProvider.of(this).get(MyViewModel.class)
Поэтому я не знаю, как передать дополнительный аргумент String param
в свой обычай ViewModel
. Я могу передать только контекст приложения, но не дополнительные аргументы. Буду очень признателен за любую помощь. Спасибо.
Изменить: я добавил код. Надеюсь, сейчас лучше.
android
mvvm
viewmodel
android-components
Марио Рудман
источник
источник
Ответы:
У вас должен быть фабричный класс для вашей ViewModel.
И при создании экземпляра модели представления вы делаете следующее:
Для котлина вы можете использовать делегированное свойство:
Также есть еще один новый вариант - реализовать
HasDefaultViewModelProviderFactory
и переопределитьgetDefaultViewModelProviderFactory()
создание экземпляра вашей фабрики, а затем вы могли бы вызвать фабрикуViewModelProvider(this)
илиby viewModels()
без нее.источник
ViewModel
классу нужна его ViewModelFactory?ViewModel
может / будет другой DI. Как узнать, какой экземпляр вернетcreate()
метод?ViewModel
создание мешает методget()
. На основе документации: «Возвращает существующую ViewModel или создает новую в области (обычно это фрагмент или действие), связанной с этим ViewModelProvider». см .: developer.android.com/reference/android/arch/lifecycle/…return modelClass.cast(new MyViewModel(mApplication, mParam))
чтобы избавиться от предупрежденияРеализация с внедрением зависимостей
Это более продвинуто и лучше для производственного кода.
Dagger2 , Square's AssistedInject, предлагает готовую к производству реализацию для ViewModels, которая может вводить необходимые компоненты, такие как репозиторий, который обрабатывает запросы сети и базы данных. Это также позволяет вручную вводить аргументы / параметры в действие / фрагмент. Вот краткое описание шагов по реализации с помощью кодовых Gists, основанное на подробном сообщении Габора Варади, Dagger Tips .
Dagger Hilt - это решение следующего поколения в альфа-версии по состоянию на 7.12.20, предлагающее тот же вариант использования с более простой настройкой, когда библиотека находится в состоянии выпуска.
Внедрить с жизненным циклом 2.2.0 в Kotlin
Передача аргументов / параметров
Включение SavedState с аргументами / параметрами
источник
Для одной фабрики, совместно используемой несколькими разными моделями представления, я бы расширил ответ mlyko следующим образом:
И создание экземпляров моделей представления:
С разными моделями просмотра с разными конструкторами.
источник
На основе @ vilpe89 вышеуказанное решение Kotlin для случаев AndroidViewModel
}
Затем фрагмент может инициировать viewModel как
А затем фактический класс ViewModel
Или каким-нибудь подходящим способом ...
источник
Я сделал это классом, в который передается уже созданный объект.
А потом
источник
Я написал библиотеку, которая должна сделать это более простым и понятным, не требуя множественных привязок или заводских шаблонов, при этом беспрепятственно работая с аргументами ViewModel, которые могут быть предоставлены как зависимости Dagger: https://github.com/radutopor/ViewModelFactory
В представлении:
источник
(КОТЛИН) Мое решение использует немного Reflection.
Допустим, вы не хотите создавать один и тот же класс Factory каждый раз, когда вы создаете новый класс ViewModel, которому требуются некоторые аргументы. Вы можете сделать это с помощью Reflection.
Например, у вас будет два разных Activity:
И ViewModels для этих действий:
Затем волшебная часть, реализация класса Factory:
источник
Почему бы не сделать так:
а затем используйте это в два этапа:
источник
myViewModel.initialize(param)
вonCreate
деятельности, например, он может быть вызван несколько раз на том жеMyViewModel
случае, когда пользователь поворачивает устройство.Вызов модели просмотра в действии
Для получения дополнительной информации: Пример Android MVVM Kotlin
источник